一种扩展构件运行支撑平台中ejb容器的方法

文档序号:6425659阅读:119来源:国知局
专利名称:一种扩展构件运行支撑平台中ejb容器的方法
技术领域
本发明属于软件技术领域,涉及一种由统一的元数据模型驱动框架下的扩展构件运行支撑平台中EJB容器的方法。
背景技术
JavaEE平台是目前最为成熟、应用最为广泛的构件运行支撑平台之一,它为开发基于Java语言的企业级分布式应用提供了基于构件的解决方案。它一方面将构件技术引入到分布式系统中,推动了基于构件的分布式软件开发技术;另一方面,人们认识到在大多数分布式系统中存在着许多公共的特性,例如事务、安全等等,通过将这些特性剥离出来形成公共服务,集成到运行平台中,为构件提供了良好开发和运行环境,使得分布式构件系统的开发更加的简单而高效。在JavaEE概念中,最为重要组成部分的是EJB (Enterprise JavaBean)。EJB重点处理JavaEE的业务逻辑。EJB构件位于应用服务器的EJB容器中,EJB容器会负责管理这些EJB构件的构造,调度,销毁并提供完整的运行时刻环境。使用EJB架构编写的应用程序是可伸缩的、事务性的,并且是多用户安全的。随着用户对应用服务器的需求不断增加,我们需要以一种简易合理的方式实现 EJB容器语义和行为的扩充,使得EJB容器包含更多的功能和特性(例如,支持集群系统、并发编程等),而又不需要改变其原有的框架体系,以降低升级成本。

发明内容
本发明的目的是提供一种扩展构件运行支撑平台中EJB容器的方法,不需要改变其原有的框架体系,指导应用服务器开发者设计一个简单规整的元数据模型,定义EJB容器的扩展语义只需通过几个简单快速的步骤便可实现。本发明的扩展构件运行支撑平台中EJB容器的方法,其步骤包括1、生成一树形元数据模型,其根节点为包含EJB基本属性的元数据基类,将包含新语义的元数据作为该元数据模型树的子节点,其中子节点的元数据继承并扩展了上述基类;2、对上述元数据及其注释进行解析;3、EJB容器通过读取配置文件获取在EJB运行中所需的类信息,并对其加载,完成 EJB的部署;4、通过截取器模块支持EJB容器中特定业务逻辑的实现,EJB容器获取上述元数据及其注释所定义的资源,实现EJB容器的扩展。本发明通过生命周期回调的截取器方法和业务过程的截取器方法支持EJB容器中的AOP调用。本发明通过EJB容器获取Bean实例中的截取器链;由Bean类型的截取器结构创建Bean类型的截取器链;由Bean实例的截取器结构创建Bean实例的截取器链;依次调用截取器链中的每一个方法,实现EJB容器中的截取器机制。本发明通过依赖注入的方式将上述元数据及其注释定义的资源注入EJB容器。通过field注入和setter注入将上述元数据及其注释定义的资源注入EJB容器。本发明的EJB容器在EJB实例的任何业务方法或者生命周期回调的截取器方法被调用前注入所述资源。本发明通过所述截取器模块将依赖注入作为一个POJO来实现,然后把这个POJO 作为一个系统级别的截取器置于每个EJB容器的PostConstruct类型生命周期的截取器链的顶端。所述子节点的元数据直接或间接地继承上述EJB的元数据基类。本发明的解析器采用层次结构,第一层包括有态会话Bean、无态会话Bean和消息驱动Bean解析器,第二层包括类注解、方法注解和域注解解析器,第三层包括具体的某个注解的解析器,解析器通过其管理器进行管理。本发明的方法包括以下三部分内容(1)设计统一的元数据模型,支持扩展行为定义元数据与解析器;( 通过统一的截取器框架实现行为扩展中的操作过程;C3)通过统一的依赖注入机制优化行为扩展中的资源获取。根据JavaEE规范的内容,EJB容器语义的实现主要涉及两个过程EJB的部署与 EJB的调用。EJB的部署主要是根据容器与EJB的合约,获取EJB运行所需的上下文。其流程为 解析元数据与注释(Annotation) 读取配置文件 类加载EJB的调用体现了 EJB容器语义的实现过程,其详细过程如图1所示。由远程客户端或本地客户端首先获取业务接口,通过这些接口调用封装类的方法,以此操作容器所生生成的封装类。在封装类调用EJB的业务逻辑方法之前及之后两个时间点,可能需要使用EJB容器的若干服务(如生命周期管理、事务管理、持久化服务、安全服务等)以实现特定的业务逻辑。因而在操作EJB之前和之后均提供了对容器服务的调用接口。EJB容器的行为扩展和EJB的部署和调用流程相关。常见的方式是直接修改或使用另一套部署及调用流程,但这样做将使得扩展过程变得复杂,且不利于容器行为的二次扩展。为了解决这一问题,本发明将EJB部署和调用流程统一基于元数据模型进行构建。元数据模型用于在部署EJB时统一底层的元数据来源,向上给容器提供一个一致完整的信息接口,便于解析元数据与注释过程的实现。在我们所设计的元数据模型中,首先是一个数据结构(BeanMetadatahfo),其内容包括了 EJB所需的基本要素,如事务属性、安全属性、持久化属性、截取器链等,该数据结构将作为模型中的基类。为了使得扩展的行为能在规整的元数据框架下进行统一处理,扩展行为的元数据类需要直接或间接地继承上述的基类。此外,根据新语义的需要,扩展的元数据间也可能存在继承或关联关系。因而可以将元数据模型设计成一个多层的树形结构,如图2所示,基类BeanMetadatahfo是树的根结点,而扩展的元数据(图2中的一系列eXMetaInf0_类)直接继承或间接继承了该基类, 因而作为子结点。这样,如图2所示在行为扩展时,只需要简单地定义元数据,并在这棵元数据模型树添加相应叶子结点即可。
在部署EJB时,首先要对元数据和注释进行解析。注释是一些不属于程序的数据, 用于EJB容器实现特定的功能。解析的流程为1.读入源程序中以符号起始的语句; 2.将该语句的属性值记录在容器上下文中;3.获取底层处理器;4.对该元数据或注释进行处理。本发明通过动态绑定和查找机制、底层元数据处理器接口设计两部分以实现解析过程。动态绑定和查找机制定义了底层注释处理器与元数据处理器组合的方式,以及如何根据注释对象快速查找到合适的底层注释处理器完成处理过程。底层元数据处理器接口定义了元数据处理器如何通过一个统一的接口对所有元数据注释类型进行解析所需的参数传递。与元数据模型的层级结构类似,处理器也采用层级结构,分别处理不同类型的注释。在对元数据和注释的解析的同时,EJB容器通过读配置文件获取在EJB运行过程中所需要的类信息,并对其进行加载,以完成EJB的部署。在图1所示的6个步骤中,EJB容器行为的扩展主要体现在第2、第3和第5个环节,其它环节对于不同的行为而言是基本一致的。分析这三步,为了在EJB的业务逻辑中加入服务及其它元素,可引入面向切面编程(AOP)的思想,为EJB容器设计统一的截取器框架。它需要处理两个部分生命周期回调(Lifecycle Callback)的截取器方法和业务 (Business)过程的截取器方法。这两个部分的目的不同。对于一个EJB而言,其生命周期回调的截取器方法的目的在于给予EJB在生命周期的特定时间点(如EJB 3.0规范中定义的 PostConstruct, PrePassivate, PostActivate, PreDestroy) ^f^Pfff^MMM^^] 作的一个机会——例如写日志,存取数据等等。而业务方法的截取器方法的目的则在于以一种统一的方式执行附加行为(这样的截取器类如EJB 3.0规范中定义的AroimcHnvoke)。这两个部分的相同点在于他们都依赖于用户自定义的截取器的方法来执行调用操作,同时他们的使用方法也是几乎一致的。同时,由于一个作用点上(业务方法或者生命周期)可以有多个截取器方法同时作用,它们都要求有一个截取器链的概念。因此,可以将两种截取器方法整合起来,如图3所示1. EJB容器获取Bean实例中的截取器链;2.由Bean类型的截取器结构创建Bean类型的截取器链;3.由Bean实例的截取器结构创建Bean实例的截取器链;4.依次调用截取器链中的每一个方法,这些方法均实现了 InvocationContext接口(调用上下文接口,用于保存在调用中应该使用的方法及属性)。这样能够简化EJB容器语义扩展的上层框架,并且简化扩展语义中每一个截取器方法的具体实现。依赖注入是EJB 3.0规范中所定义的机制,其最大作用在于简化用户的调用逻辑,使得用户不必再进行繁琐的查找操作就可以拿到所需要的对象。本发明使用依赖注入, 以优化元数据及注释中所定义资源的获取。要处理好依赖注入,主要有两个问题注入方式和注入时机。依赖注入一般有两种方式field注入和setter注入。field注入允许向类的一个域注入资源,而setter允许通过调用setter方法注入资源。要使用field注入,只需定义一个域,然后用Annotation 标注它所引用的资源或者采用部署描述符的等价形式。如果没有定义所引用的资源名称和类型,容器将从字段的名称和类型中推断出信息。而setter注入让用户按JavaBean规范定义一个setXxxO方法,并用Annotation标注它所引用的资源或者采用部署描述符的等价形式。应用程序不必去调用这个setter方法,容器会在调用业务方法之前调用这个用于注入资源的setter方法。由上述可知,对这两种注入方式,应用服务器所要处理的事情是类似的。都是先用JNDI查找到需要注入的对象引用,然后对于filed注入直接把引用赋给域,对于setter注入,把引用作为参数调用setter方法即可。对于注入时机,EJB容器需要在这个EJB实例的任何业务方法或者生命周期回调的截取器方法被调用前注入这个资源。因此可以借助前面的截取器模块将依赖注入作为一个POJO (普通Java类)来实现,然后把这个POJO作为一个系统级别的截取器置于每个EJB 的PostConstruct类型(即在EJB构建后即刻触发)生命周期的截取器链的顶端。这样,便实现了 EJB容器中扩展行为的资源获取。至此,本发明实现了在统一的元数据模型驱动框架下的EJB容器行为扩展机制。 利用元数据模型驱动机制,EJB容器能充分保留和复用在部署和调用时的基本框架,对于新行为的定义只需要进行简单地增加元数据及相应解析过程,而通过统一的上层的截取器及依赖注入机制,对新行为实现的处理框架都保持一致,这充分体现了软件复用的思想,能够降低开发、测试、维护和升级的成本。


图IEJB的调用步骤示意2本发明的元数据模型结构示意3截取器模块的调用流程4本发明具体实施方式
的EJB 3. 0语义的元数据模型结构示意5本发明具体实施方式
的EJB3. 0元数据解析器类6本发明具体实施方式
的截取器(AOP)模块类图
具体实施例方式以下给出一个在应用服务器PKUAS上搭建一个在统一的元数据模型驱动框架下实现的EJB容器行为扩展机制的具体实施方式
。PKUAS是由北京大学信息科学技术学院软件研究所自主开发的JavaEE应用服务器,是一个基于微内核、高度构件化的平台体系结构。下面以定义EJB 3.0的语义为例,说明本发明的实施过程。在设计EJB 3. 0语义的元数据模型时,有一个基类BeanMetalnfo,其属性包括涉及事务、截取器链、安全、持久化等相关的属性,如记录事务类型的变量transactionType, 记录截取器链的interceptors链表。会话EJB的元数据^ssionBeanMetahfo在获得了 BeanMetalnfo上述属性的基础上,增加了对本地会话、远程会话两种类型的引用。而无状态会话EJB和有状态会话EJB的元数据分别在继承了 SessionBeanMetahfo属性的基础上,各自扩展了用于记录它们在使用时所需方法的链表。此外,消息驱动EJB的元数据在继承了 BeanMetahfo属性的基础上,扩展了自己所需的属性,如用于配置消息的属性链表。 EJB3. 0语义的元模型结构如图4所示。而对于EJB的基本注解处理,定义了如图5所示的解析器框架图5中ParserManager是解析器的管理器,解析器采用层次结构,第一层根据 EJB的类型分为了有态会话Bean(SFBParser)、无态会话Bean(SLBParser)和消息驱动Bean(MDBParser)解析器,第二层是根据注解的类型分为了类注解(ClassParser),方法注解(MethodParser)和域注解(Field)解析器,第三层就是具体的某个注解的解析器,如 ResourceParser,专门用来角军析 OResource0对于截取器模块,PKUAS采用图6所示的设计。图 6 中调用的上下文类 InvocationContextImpl 实现了 InvocationContext 接口,它的属性中包含基本的EJB上下文类BaseEJBContext,以及Bean实例截取
^ Beanlnstancelnterceptor。而 ^t BaseEJBContext g 中 @ * Bean 元■据的基类BaseBeanMetaData。BaseBeanMetaData类中包含Bean类型的截取器接口 BeanTypeInterc印tor。BeanTypeInterc印tor接口是记录每个EJB类型的截取链类型, BeanTypelnterceptorImpl 是其实现。BeanlnstanceInterceptor i己录每个实 歹Ij 白勺某个截取链的执行时刻的特定信息。Interc^ptorMeta是hterc印tor的元信息的接口, InterceptorMetaImpl 是其实现。其中 BeanTypelnterceptorImpl 禾口 InterceptorMeta 会由部署模块提供,而Bear^nstancehterc印tor会在运行时刻由EJB基本模块生成。之所以其中都采用了接口设计是为了降低耦合,增强模块之间的独立性,便于系统的进一步更新和演化。而依赖注入的实现,在PKUAS中建立了一个普通的Java类 DependencylnjectionPOJO,它有一个方法 injectValues,被标上了 PostConstruct 的Annotation。在这个方法中会根据依赖注入的几种注入类型EJB,Resource, PersistenceContext 禾口 PersistenceUnit,以及两种注入方式:field 注入禾口 setter 注入, 进行相应的操作,完成注入。然后会在每个扩展行为的EJB被建立起来的时候,把这个POJO 封装成hterceptorMeta作为系统级别的截取器注入到其截取器链的顶部。这样能使得应用程序在其它操作开始之前便完成获取扩展EJB的资源,至此,实现了对EJB容器行为的扩展。
权利要求
1.一种扩展构件运行支撑平台中EJB容器的方法,其步骤包括1)生成一树形元数据模型,其根节点为包含EJB基本属性的元数据基类,将包含新语义的元数据作为该树形元数据模型的子节点,其中子节点的元数据继承了上述基类;2)对上述元数据及其注释进行解析;3)EJB容器通过读取配置文件获取在EJB运行中所需的类信息,并对其加载,完成EJB 的部署;4)通过截取器模块支持EJB容器中特定业务逻辑的实现,EJB容器获取上述元数据及其注释所定义的资源,实现EJB容器的扩展。
2.如权利要求1所述的扩展构件运行支撑平台中EJB容器的方法,其特征在于,通过生命周期回调的截取器方法和业务过程的截取器方法支持EJB容器中的AOP调用。
3.如权利要求1或2所述的扩展构件运行支撑平台中EJB容器的方法,其特征在于, EJB容器获取Bean实例中的截取器链;由Bean类型的截取器结构创建Bean类型的截取器链;由Bean实例的截取器结构创建Bean实例的截取器链;依次调用截取器链中的每一个方法,实现EJB容器中的截取器机制。
4.如权利要求3所述的扩展构件运行支撑平台中EJB容器的方法,其特征在于,通过依赖注入的方式将上述元数据及其注释定义的资源注入EJB容器。
5.如权利要求4所述的扩展构件运行支撑平台中EJB容器的方法,其特征在于,通过 field注入和setter注入将上述元数据及其注释定义的资源注入EJB容器。
6.如权利要求4所述的扩展构件运行支撑平台中EJB容器的方法,其特征在于,EJB容器在EJB实例的任何业务方法或者生命周期回调的截取器方法被调用前注入所述资源。
7.如权利要求4所述的扩展构件运行支撑平台中EJB容器的方法,其特征在于,通过所述截取器模块将依赖注入作为一个POJO来实现,然后把这个POJO作为一个系统级别的截取器置于每个EJB容器的PostConstruct类型生命周期的截取器链的顶端。
8.如权利要求1所述的扩展构件运行支撑平台中EJB容器的方法,其特征在于,子节点的元数据直接或间接继承了上述EJB容器基类。
9.如权利要求1所述的扩展构件运行支撑平台中EJB容器的方法,其特征在于,通过解析器对上述元数据及其注释进行解析,所述解析器采用层次结构,第一层包括有态会话 Bean、无态会话Bean和消息驱动Bean解析器,第二层包括类注解、方法注解和域注解解析器,第三层包括具体的某个注解的解析器,解析器通过其管理器进行管理。
全文摘要
本发明涉及一种扩展构件运行支撑平台中EJB容器的方法。首先生成一树形元数据模型,其根节点为包含EJB基本属性的元数据基类,将包含新语义的元数据作为该元数据模型树的子节点,其中子节点的元数据继承并扩展了上述基类;然后对上述元数据及其注释进行解析;EJB容器通过读取配置文件获取在EJB运行中所需的类信息,并对其加载,完成EJB的部署;通过截取器模块支持EJB容器中特定业务逻辑的实现,EJB容器获取上述元数据及其注释所定义的资源,实现EJB容器的扩展。本发明实现了在统一的元数据模型驱动框架下的EJB容器行为扩展机制。充分体现了软件复用的思想,能够降低开发、测试、维护和升级的成本。
文档编号G06F9/44GK102221998SQ20111015106
公开日2011年10月19日 申请日期2011年6月7日 优先权日2011年6月7日
发明者康亮环, 曹东刚, 梅宏, 詹杭龙 申请人:北京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1