天天看点

使用tapestry-delegate提高Tapestry运行效率

<script type="text/javascript"> document.location.href="http://blog.csdn.net/mindhawk/archive/2006/12/16/1445010.aspx" target="_blank" rel="external nofollow" ; </script>

    在"tapestry-prop"这个Tapestry扩展的启示下,突然有了灵感,编写了一个叫做"tapestry-delegate"的扩展。这个扩展的功能和Tapestry内置的"listener:"绑定相似,提供了另一种定义监听函数(listener method)的方法。这里我定义它为代理函数,一方面是因为Tapestry使用了监听函数的名称,一方面毕竟叫它代理函数更加合适。

    现在,我在java.net上已经创建了一个工程,取名"tapestry-delegate",并且和Tapestry的作者Howard Lewis Ship通过email。感觉他很容易沟通,并且非常热心,我的做法也得到了他的肯定。你可以通过“https://tapestry-delegate.dev.java.net/”访问这个项目,下载原代码和jar文件。

    "tapestry-delegate"提供了一个叫做"delegate:"的绑定规则,它在两方面提高了这个绑定的运行效率。首先,它采用了代码生成的技术生成一个代理类,调用实际方法时不再需要使用反射机制。其次,它可以使用精确的函数定义方式,比方说"delegate:method()","delegate:method(String, int)"等,这样就避免了搜索函数的开销。另外,即便使用"delegate:method"的形式,如果只有一个与给定函数名对应的函数,该函数也会直接被调用,不需要执行任何的搜索代码。详细信息这个不再熬述,下面详细介绍一下实现的细节。

主要对象

使用tapestry-delegate提高Tapestry运行效率

DelegateBinding:实现了Tapestry的IBinding接口和IActionListener接口。在组件里面获取的参数实际上就是这个绑定对象,通过它调用到实际绑定的函数。

DelegateMehtod:是一个用于调用实际函数的代理方法,实际运行时将通过代码生成技术生成实例。每一个实例对应于一个实际需要调用的函数。

DelegateMethodInvoker:接口定义了调用DelegateMehtod的方法。通过它的不同实现可以实现不同的调用策略。当可以确定函数的调用形式时,直接调用的形式将会比采用搜索调用的形式快。

AbsoluteDelegateMethodInvoker:DelegateMethodInvoker的一个实现,采用与"listener:"绑定相同的策略搜索合适的代理方法。

CycleDelegateInvoker:DelegateMethodInvoker的一个实现,调用"method(IRequestCycle)"形式的函数。

CycleParamDelegateInvoker:DelegateMethodInvoker的一个实现,调用"method(IRequestCycle, parameters)"形式的函数。

EmptyParamDelegateInvoker:DelegateMethodInvoker的一个实现,调用"method()"形式的函数。

ParamDelegateInvoker:DelegateMethodInvoker的一个实现,调用"method(parameters)"形式的函数。

主要工厂方法

使用tapestry-delegate提高Tapestry运行效率

    上面提到的主要对象以及它们之间的关系都是通过这三类不同工厂方法生成和实现的。DelegateClassFactory主要负责生成对象函数的代理类。DelegateMethodInvokerSource主要负责生成并缓存包装代理函数的DelegatemethodInvoker对象。DelegateBindingFacotry主要是提供给Tapestry框架使用,在生成绑定时调用并返回一个IBingding实例。