Javassist设计让EJB3变得更精彩

Javassist 是个日本人开发的一种执行字节码操作的强而有力的驱动代码库,后来归到了Jboss门下,看在Jboss的面子上,我们就勉强学习一下。它允许开发者自由的在一个已经编译好的类中添加新的方法,或者是修改已有的方法。但是,和其他的类似库不同 的是,Javassist并不要求开发者对字节码方面具有多么深入的了解,同样的,它也允许开发者忽略被修改的类本身的细节和结构。看起来和ASM,BCEL等字节码操作技术差不多,不过事实上的确也差不多只是使用起来更加的简单而已。
Javassist已经在很多我们熟悉的项目中被悄悄地使用了,比如说Jboss, Tapestry, hivemind(这一个非常棒的ICO容器,用过她之后,我都不想再看到Spring了,下次再详细介绍)等。
本来想详细写一下使用方法,可是在Javaeye里搜索了一下,结果一位Icon是星爷的同志已经先我一步了,我详细的看了一下,他把基本的Javassist对method的操作介绍的很详细了。那我就不重复了,这是他的文章的链接。http://www.javaeye.com/topic/53740
我接下来要介绍的是我所设计的另类的使用Javassist的方法。
大家都知道Java5.0 带给我们了一个有意思的新玩意儿@ Annotation。 很多人对他是褒贬不一。但是我个人还是满喜欢 annotation的。举例说明吧,Apache beehive中就大量的运用的 Annotation技术,这种方法简化了Struts的开发,省去了很多配置xml的步骤。所以,这个还是其实还是不错的,我相信以后会有更多的项目会使用到他。
我着重要介绍的是Javassist结合EJB3的应用。EJB3也是一个大量运用 Annotation来省去配置文件的项目。他相比较EJB2简化了很多。我不知道其他人是如果运用EJB3的,但是在我的运用中,大量的Class仅仅就是被定义为Stateless或是Stateful的EJB类型。来实行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的方法。这样再配合Ioc中XML的定义,就可以实现任何的Class都能动态的变为Ejb3 service了。
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代码并不是正规的hivemind的XML定义方式。是更改过的hivemind版本的代码,所以不具有参考价值,只是为了说明Ejb3的各种类型可以声明在xml中来获取。
现在就用Javassist来注入EJB3 Annotation。(Javassist注入 annotation教程 @_@)
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.add Annotation(stateless);  
11.     //添加一个Stateless annotation,其他的 annotation 也可以用相同的方法来实行….注意:如果 Annotation中带有参数的可以使用new Annotation(" annotation").addMemberValue(“ParamKeywork”, ArrayMemberValue);来实现。  
12. }  
13. classFile.addAttribute(attr);  
14. UserClassloader.putClass(ejb3Service.toClass());  
这些代码仅仅是要实现动态Ejb3 service的一小部分,因为如此定义Ejb3 service的话,就一定要用动态Deploy,去*.war文件运行时实现动态的部署Ejb3服务,而不是以Ejb3的形势放入Weblogic里。这部分很复杂,但我已经让他实现了。具体想法我曾发在Bea的论坛里,这里是地址,有兴趣的朋友可以看一下。
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=121&threadID=39271&start=0&tstart=270
(我被骂的很惨,不过我也同意这种打破规范的设计的确不太好)
我个人觉得这样做很酷,而且我在网上也没见过其他人做过。我正在考虑要不要做成通用的OpenSource项目,把所有的Ejb3内容都动态化,这样任何一个普通的Class就可以通过XML中的简单定义,而成为一个复杂的Ejb3的服务。
* 相信随着 Annotation运用的更加普及,Javassist的这一功能会有更大的用武之地
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值