一种基于动态栈的EJB3 容器AOP 实现方法技术

技术编号:7459449 阅读:445 留言:0更新日期:2012-06-24 05:48
一种基于动态栈的EJB3容器AOP实现方式,使用预编译和动态栈两种方式相结合的方式来实现EJB容器对业务方法的拦截。针对如日志、事务管理和安全等系统服务对所有的EJB处理方式一致的特点,将相应代码通过预编译方式重新生成源代码,减少了处理拦截器请求的时间,并通过配置文件的方式使得尽量减少对源代码的侵入式修改。对于EJB的业务方法拦截器,考虑到程序员经常修改编辑拦截器类的特点,采用动态栈的方式避免了预编译反复生成源代码的缺陷;同时相比动态代理方式节约了大量生成动态代理类的内存空间。使用静态和动态相结合提高EJB容器对业务方法拦截的速度与灵活性。

【技术实现步骤摘要】
一种基于动态栈的EJB3容器AOP实现方法
本专利技术提出了 Java EE系统架构下一种基于动态栈的实现EJB3业务方法拦截的方法。该方法结合预编译和动态栈的方式分别处理系统级别和业务方法级别的拦截器方法,提高了 EJB容器对业务方法拦截的速度与灵活性。
技术介绍
AOP 为 Aspect Oriented Programming 的缩写,即面向切面编程。AOP技术利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面,也就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。使用“横切”技术,AOP把软件系统分为两个部分核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。AOP的目的就是将核心关注点和横切关注点分离。EJB3. 0引入了 AOP中的拦截器概念,指出程序员可以在业务方法的执行前后加入其他非核心业务方法即拦截器方法。拦截器是可以对bean的业务方法和生命周期事件进行拦截的组件,在这些方法被访问之前,进行拦截然后在之前或之后加入某些操作。但是为什么要在EJB3规范中引入拦截器呢?从前面的叙述可知拦截器是面向切面编程的一部分,切面可以看成是关注点,比如在执行主要的商业逻辑代码之前所做的事务、安全等操作,这些操作虽然比较普通,但是也会贯穿整个程序的始终,使得程序代码中充斥着大量相同的代码,不仅削弱了代码的可读性,而且也给应用程序的开发和维护带来不必要的麻烦。有了拦截器之后,就可以拦截主要的业务逻辑,把非业务逻辑的代码“注入” 到里面去,实现业务逻辑代码和相对不重要的安全、日志等代码的分离开来,提高应用程序的可维护性和可读性。目前实现AOP的技术,主要分为两大类一是采用动态代理技术,利用截取消息的方式,动态生成原有对象的代理对象以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。 当前Java平台下实现了 AOP的主流项目主要有AspectJ、JBoss、Spring。预编译方式的代表是AspectJ。AspectJ采用了在预编译过程中重新生成源代码的方式,有自己专门的编译器和AOP语法,但AspectJ没有利用反射技术或代理技术,而仅仅是程序的静态扩展而已。然而这种源代码生成方式实现的AOP虽然在性能上具备一定的优势,但它过于复杂,修改源代码的侵入式编程破坏了原来代码的结构性,给开发带来一定的问题。JBoss和Spring的AOP都实现利用了 JDK提供的动态代理技术。当拦截到业务方法的请求时,根据业务方法需要执行的拦截器元数据信息,依次生成代理类ft~0Xy,并且形成一条链式结构,依次执行这些拦截器方法。
技术实现思路
本专利技术的目的在于克服预编译和动态代理两种方式AOP实现的缺陷,提供了一种基于动态栈的EJB3容器AOP实现方式,使用预编译和动态栈两种方式相结合的方式来实现 EJB容器对业务方法的拦截。针对如日志、事务管理和安全等系统服务对所有的EJB处理方式一致的特点,将相应代码通过预编译方式重新生成源代码,减少了处理拦截器请求的时间,并通过配置文件的方式使得尽量减少对源代码的侵入式修改。对于EJB的业务方法拦截器,考虑到程序员经常修改编辑拦截器类的特点,采用动态栈的方式避免了预编译反复生成源代码的缺陷;同时相比动态代理方式节约了大量生成动态代理类的内存空间。使用静态和动态相结合提高EJB容器对业务方法拦截的速度与灵活性。为达到上述目的,本专利技术采用的技术方案是根据拦截器方法作用和性质的不同,将拦截器方法分为系统级别和业务逻辑级别两种类型,分别采用预编译和动态栈的方式处理EJB3相应的拦截器方法。1)预编译方式处理系统级别拦截器方法EJB容器分离了一般应用系统的一些通用功能,例如事务机制、安全机制以及对象池或线程池等性能优化机制,这些功能是每个应用系统几乎都需要的,因此可以从具体应用系统中分离出来。系统级别的拦截器方法主要就是指对EJB的日志、安全和事务管理等通用功能,将这类的拦截器方法交由EJB容器执行,这对简化EJB的开发、维护EJB运行的稳定性和快速性都很非常重要。通过预编译的方式将这类方法织入源代码中,在业务方法的执行前和执行后插入相应的预处理和后处理系统级别拦截器方法调用即可完成系统功能方法和业务逻辑方法的分离和拦截。当EJB容器要管理的系统级别拦截功能很多的时候,预编译的速度会相应降低。 在EJB容器要管理的系统级别拦截功能变动或修改很大的情况下,预编译的模板还要做繁琐的修改,这就给预编译方式带来了不便。因此,为预编译织入的代码提供统一的接口,简化预编译的过程尤为重要。按照 EJB容器提供的系统级别拦截器功能执行的先后次序,利用反射机制将这些方法依次入栈和出栈,通过弹栈的方式依次执行位于栈顶的方法,大大减轻了维护编译模板的压力;同时尽量减小了对源代码的修改,提高了预编译的速度。2)动态栈方式处理业务逻辑级别拦截器方法EJB3规范指出程序员除了可以使用系统级别拦截器之外,还可以自定义业务方法拦截器和生命周期拦截器,这两种统称为“业务逻辑拦截器”。和由EJB容器管理的实现通用功能的系统级别拦截器方法相比,EJB的业务逻辑拦截器由程序员维护。程序员经常需要修改编辑拦截器类和方法,如果采用预编译方式需要不停的往EJB源代码中织入不同的代码,造成的后果就是一个很小的改动需要花费很大的预编译代价,增大了开发的负担。如果采用当前大多数应用服务器所使用的动态代理方式,为EJB的每个业务逻辑级别拦截器类都生成了一个动态代理类,按照调用的先后顺序形成了动态代理类链。虽然动态代理方式可以避免预编译反复生成源代码的缺点,但也有如下缺陷。动态代理类是运行时生成的类,消耗一定的内存空间;而且动态代理类不会做任何实质性的工作,它只能拦截到业务方法的调用请求,将调用转给一个调用请求的处理类,而这个类也必须是调用者提供。使用动态栈的方式避免了这两者的缺陷,既不需要将业务逻辑级别的拦截器方法通过预编译织入源代码中也不需要像动态代理方式一样生成动态代理类和提供实现了调用请求的处理类。拦截到业务方法调用之后,根据解析的EJB的元数据中相关的自定义拦截器类和方法的信息,按照要求的顺序将拦截器方法依次入栈。将方法栈和业务方法的信息封装成一个调用上下文hvocationContext传递给第一个执行的拦截器方法。每个拦截器方法体都分为三部分首先是业务方法执行前的预处理代码,其次是业务方法执行后的后处理代码,在预处理和后期处理之间,执行后续的拦截器方法。具体执行后续拦截器方法的步骤为弹出栈顶拦截器方法,并将弹出栈顶拦截器方法的栈和业务方法的信息重新封装成 hvocationContext传给该方法,最后通过反射机制调用该方法。后续拦截器方法执行返回之后,本拦截器方法可以继续执行后续的后处理工作了。附图说明图1是预编译源文件的接口示意图。本文档来自技高网
...

【技术保护点】

【技术特征摘要】

【专利技术属性】
技术研发人员:齐勇王培培杨涛郝莹耀
申请(专利权)人:西安交通大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1
相关领域技术