Javassist设计让EJB3变得更精彩

Javassist 是个日本人开发的一种执行字节码操作的强而有力的驱动代码库,后来归到了Jboss门下,看在Jboss的面子上,我们就勉强学习一下。它允许开发者自由的在一个已经编译好的类中添加新的方法,或者是修改已有的方法。但是,和其他的类似库不同 的是,Javassist并不要求开发者对字节码方面具有多么深入的了解,同样的,它也允许开发者忽略被修改的类本身的细节和结构。看起来和ASMBCEL等字节码操作技术差不多,不过事实上的确也差不多只是使用起来更加的简单而已。<o:p></o:p>

Javassist已经在很多我们熟悉的项目中被悄悄地使用了,比如说Jboss, Tapestry hivemind(这一个非常棒的ICO容器,用过她之后,我都不想再看到Spring了,下次再详细介绍)等。<o:p></o:p>

本来想详细写一下使用方法,可是在Javaeye里搜索了一下,结果一位Icon是星爷的同志已经先我一步了,我详细的看了一下,他把基本的Javassistmethod的操作介绍的很详细了。那我就不重复了,这是他的文章的链接。<o:p></o:p>http://www.iteye.com/topic/53740 <o:p></o:p>

我接下来要介绍的是我所设计的另类的使用Javassist的方法。<o:p></o:p>

大家都知道Java5.0 带给我们了一个有意思的新玩意儿@Annotation 很多人对他是褒贬不一。但是我个人还是满喜欢annotation的。举例说明吧,Apache beehive中就大量的运用的Annotation技术,这种方法简化了Struts的开发,省去了很多配置xml的步骤。所以,这个还是其实还是不错的,我相信以后会有更多的项目会使用到他。<o:p></o:p>

我着重要介绍的是Javassist结合EJB3的应用。EJB3也是一个大量运用Annotation来省去配置文件的项目。他相比较EJB2简化了很多。我不知道其他人是如果运用EJB3的,但是在我的运用中,大量的Class仅仅就是被定义为Stateless或是StatefulEJB类型。来实行Ejb3服务。举例:

java 代码
 
  1. @Stateless  
  2. @TransactionAttribute(NEVER)  
  3. @ExcludeDefaultInterceptors  
  4. public class ServiceBean implements Service {  
  5.     // 简单的weblogic stateless Ejb 定义方式。  
  6.         ...............  
  7. }  

从上面的例子可以看出,如果我们去除掉Annotation的话,ServiceBean仅仅就是个普通的Java Class. 所以我就想到可以运用Javassist去动态的注入相关的Ejb Annotation的方法。这样再配合IocXML的定义,就可以实现任何的Class都能动态的变为Ejb3 service了。<o:p></o:p>

xml 代码
 
  1. <?xml version="1.0"?>        
  2. <module id="dynamic.EjbService" version="1.0.0">  
  3.     <service-point id="Service" interface="com.maqujun.Service">  
  4.         <invoke-factory service-id="remote.factory">  
  5.                 <construct class="com.maqujun.ServiceBean" ejb-type="Stateless">  
  6.             // 可以定义相关的Ejb3所需的Annotation操作的声明。  
  7.             </construct>  
  8.         </invoke-factory>  
  9.     </service-point>  
  10.   <contribution configuration-id="hivemind.Remoting">  
  11.     <publish published-name="weblogic-Dynamic-Ejb"  
  12.            service-point="Service"  
  13.            protocol="EJB3">  
  14.     </publish >  
  15.   </contribution>  
  16. </module>  

以上的hivemodule.xml代码并不是正规的hivemindXML定义方式。是更改过的hivemind版本的代码,所以不具有参考价值,只是为了说明Ejb3的各种类型可以声明在xml中来获取。<o:p></o:p>

现在就用Javassist来注入EJB3 Annotation。(Javassist注入annotation教程 @_@ <o:p></o:p>

java 代码
 
  1. //首先要获得XML中定义的内容。这里就略了  
  2. ClassPool pool = ClassPool.getDefault();  
  3. CtClass ejb3Service = pool.get (ejbServiceName);  
  4. ClassFile classFile = ejb3Service.getClassFile();  
  5. ConstPool cp = classFile.getConstPool();  
  6. AnnotationsAttribute attr = new AnnotationsAttribute(cp,  
  7.         AnnotationsAttribute.visibleTag);  
  8. if (cont.getState()==State.STATELESS) {  
  9.     Annotation stateless = new Annotation("javax.ejb.Stateless", cp);  
  10.     attr.addAnnotation(stateless);  
  11.     //添加一个Stateless annotation,其他的annotation 也可以用相同的方法来实行….注意:如果Annotation中带有参数的可以使用new Annotation("annotation").addMemberValue(“ParamKeywork”, ArrayMemberValue);来实现。  
  12. }  
  13. classFile.addAttribute(attr);  
  14. UserClassloader.putClass(ejb3Service.toClass());  

<o:p></o:p>

这些代码仅仅是要实现动态Ejb3 service的一小部分,因为如此定义Ejb3 service的话,就一定要用动态Deploy,去*.war文件运行时实现动态的部署Ejb3服务,而不是以Ejb3的形势放入Weblogic里。这部分很复杂,但我已经让他实现了。具体想法我曾发在Bea的论坛里,这里是地址,有兴趣的朋友可以看一下。<o:p></o:p>

http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=121&threadID=39271&start=0&tstart=270 <o:p></o:p>

(我被骂的很惨,不过我也同意这种打破规范的设计的确不太好)<o:p></o:p>

我个人觉得这样做很酷,而且我在网上也没见过其他人做过。我正在考虑要不要做成通用的OpenSource项目,把所有的Ejb3内容都动态化,这样任何一个普通的Class就可以通过XML中的简单定义,而成为一个复杂的Ejb3的服务。<o:p></o:p>

* 相信随着Annotation运用的更加普及,Javassist的这一功能会有更大的用武之地。<o:p></o:p>












 


 


 


 


 


 


 

 

<o:p></o:p>

你可能感兴趣的:(xml,jboss,weblogic,ejb,tapestry)