`
maqujun
  • 浏览: 133310 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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>

分享到:
评论

相关推荐

    开发工具 javassist-3.21.0-GA

    开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发...

    jboss-javassist-javassist-rel_3_23_0_ga-2-gf85a72b

    jboss-javassist-javassist-rel_3_23_0_ga-2-gf85a72b 下载使用即可

    javassist3

    javassist-3.0-rc-1.jar

    javassist-3.19.0-GA-API文档-中文版.zip

    赠送jar包:javassist-3.19.0-GA.jar; 赠送原API文档:javassist-3.19.0-GA-javadoc.jar; 赠送源代码:javassist-3.19.0-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.19.0-GA.pom; 包含翻译后的API文档...

    javassist-3.23.1-GA-API文档-中文版.zip

    赠送jar包:javassist-3.23.1-GA.jar; 赠送原API文档:javassist-3.23.1-GA-javadoc.jar; 赠送源代码:javassist-3.23.1-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.23.1-GA.pom; 包含翻译后的API文档...

    jboss-javassist-javassist-rel_3_22_00_ga-46-g40d3223.zip

    Javassist是一个执行字节码操作的强而有力的驱动代码库。它允许开发者自由的在一个已经编译好的类中添加新的方法,或者是修改已有的方法。

    javassist包

    javassist包

    javassist-3.24.0-GA-API文档-中文版.zip

    赠送jar包:javassist-3.24.0-GA.jar; 赠送原API文档:javassist-3.24.0-GA-javadoc.jar; 赠送源代码:javassist-3.24.0-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.24.0-GA.pom; 包含翻译后的API文档...

    javassist-3.27.0-GA-API文档-中英对照版.zip

    赠送jar包:javassist-3.27.0-GA.jar; 赠送原API文档:javassist-3.27.0-GA-javadoc.jar; 赠送源代码:javassist-3.27.0-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.27.0-GA.pom; 包含翻译后的API文档...

    javassist-3.15.0-GA

    javassist版本 javassist-3.15.0-GA

    javassist.jar源码

    javassist-3.7.ga.jar反射类javassist.jar源码

    javassist-3.24.0-GA-API文档-中英对照版.zip

    赠送jar包:javassist-3.24.0-GA.jar; 赠送原API文档:javassist-3.24.0-GA-javadoc.jar; 赠送源代码:javassist-3.24.0-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.24.0-GA.pom; 包含翻译后的API文档...

    javassistDemo.zip

    javassist的使用,也可直接使用该demo修改自己的jar中的方法,demo中写了两种方法可供参考

    javassist-3.11.0.GA.jar

    javassist-3.11.0

    javassist-3.23.1-GA-API文档-中英对照版.zip

    赠送jar包:javassist-3.23.1-GA.jar; 赠送原API文档:javassist-3.23.1-GA-javadoc.jar; 赠送源代码:javassist-3.23.1-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.23.1-GA.pom; 包含翻译后的API文档...

    javaagent+javassist

    环境JDK1.8 IDEA项目 javaagent+javassist 下载后导入即可

    jboss-javassist-javassist-rel_3_25_0_ga-2-g9076bde.zip

    Javassist (Java Programming Assistant) makes Java bytecode manipulation simple. It is a class library for editing bytecodes in Java; it enables Java programs to define a new class at runtime and to ...

    javassistDemo

    javassistDemo代码-------Charles破解

    javassist-3.21.0-GA-API文档-中文版.zip

    赠送jar包:javassist-3.21.0-GA.jar; 赠送原API文档:javassist-3.21.0-GA-javadoc.jar; 赠送源代码:javassist-3.21.0-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.21.0-GA.pom; 包含翻译后的API文档...

    JSF1.2+EJB3.0实现的一个项目实例

    此时还需要在web端的类路径中(也就是在jsfejb3-war项目的lib文件夹中)添加以下几个Jar包(这些包都在JBoss服务器安装目录/client目录下有):ejb3-persistence.jar、hibernate-client.jar、javassist.jar、jboss-ejbs-...

Global site tag (gtag.js) - Google Analytics