`

EJB 3.0之依赖注入 (摘自网上)

阅读更多
前言
  与EJB2.1相比,EJB3.0规范引入了两个重要概念:依赖注入(DI:Dependency Injection)和截获器(Interceptor),本文首先介绍了这两个概念并给出相关示例,然后分析了EJB3.0规范在这两方面的不足之处,最终深入探讨了WebLogic Server 10对它们的支持和扩展。
2 依赖注入
  2.1 基本概念
  依赖注入是从开源社区的一些著名轻量级容器(如Spring、Pico container)中所发展出来的概念,其主要思想就是由容器而不是对象本身来负责处理对象之间的依赖关系。与传统的服务定位器相比,依赖注入具有易测试、弱侵入性等优点,这也就是为什么在最新的Java EE 5规范中引入它的原因。
依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者 实例的工作通常由Spring容器来完成,然后注入调用者,因此称为依赖注入。
  对于EJB3.0来说,依赖注入就是由容器负责查找被依赖的对象并注入到依赖bean中,而bean本身不再需要进行JNDI或者context查询。此外,依赖注入发生在任何业务方法被调用之前,而且支持setter方法注入和域注入两种方式。
  通过与标注结合使用,在bean类中声明依赖注入是非常简单的 (当然,也可以在部署描述符文件中声明依赖注入):
    @EJB用于注入EJB业务对象
    @PersistenceUnit 用于注入EntityManagerFactory
    @PersistenceContext 用于注入EntityManager
    @Resource 用于注入其它资源对象,如连接工厂、消息目标等
  2.2 示例
@Stateless
public class ServiceBean implements Service {
private javax.sql.DataSource myDS; 
@Resource(mappedName=“LocalDataSource")
public void setMyDS(javax.sql.DataSource ds) {this.myDS = ds; }
@EJB(beanName=“AccountBean")
private Account account; 
}


  在无状态会话bean ServiceBean中,声明了两个依赖:一个是数据源,一个是业务接口。在运行期间,EJB3.0容器一旦创建了ServiceBean的实例,就会分别通过方法注入和域注入将数据源对象和业务对象注入到ServiceBean中。
3 截获器
  3.1 基本概念
  作为EJB3.0中提出的新概念,截获器是可以对bean的业务方法和生命周期事件进行拦截的组件。截获器需要由@Interceptors 或 发布描述符文件中相关的标签指定。截获器可以带有状态而且可以进行依赖注入,其生命周期与其所绑定的EJB bean实例的生命周期一致。
  定义在截获器中用于拦截目的的方法被称为截获器方法,其中,针对业务方法的截获器方法通过@AroundInvoke标注或发布描述符文件中相关的标签指定;针对生命周期回调的截获器方法通过@PostConstruct, @PreDestroy等标注或发布描述符文件中对应的标签指定。
  截获器分为四类:
    缺省截获器:可作用于ejb-jar中定义的所有EJB bean。缺省截获器只能定义在DD中,不存在相应的标注
    类级截获器:只能作用于所指定的EJB bean
    方法级截获器:只能作用于所指定的某个EJB bean业务方法,方法级截获器不能用于拦截bean的生命周期事件
    bean 级截获器:又被称为自我截获器,因为截获器同时就是EJB bean本身,此时相关的截获器方法只能作用于该EJB
  3.2 截获器链的调用顺序
  因为可以为EJB定义多个截获器,所以存在截获器链的调用顺序问题,缺省情况下,以下原则被遵循:
    调用顺序依次是缺省截获器、类级截获器、方法级截获器以及bean级截获器
    对于同类别的截获器,按照声明的顺序调用
    总是优先调用父类的截获器方法。
  此外,EJB3.0规范还提供了更灵活的选项,详细信息请参考EJB3.0规范中“截获器”一节:
    在发布描述符文件中设置“exclude-default-interceptors” 可以取消对缺省截获器的调用,而应用“exclude-class-interceptors”则取消对类级截获器的调用
    为了替换缺省的截获器链调用顺序,可以设置发布描述符文件的“interceptor-order”。
  3.3 示例
@Stateless(name="Trader")
@Interceptors(ClassInterceptor.class)
public class TraderBean implements Trader {
@Interceptors(MethodInterceptor.class)
public String sell(String stockSymbol) {
…
}
@AroundInvoke
public Object selfInterceptor(InvocationContext) throws Exception {
…
}
}

  在无状态会话bean TraderBean中,声明了两个截获器:一个类级截获器,一个方法级截获器,此外,通过使用@AroundInvoke标注,TraderBean的方法selfInterceptor被声明为截获器方法,所以TraderBean就是bean级截获器。
4 EJB3.0规范在依赖注入和截获器方面的不足
  从依赖注入方面来说,EJB3.0目前支持的注入类型是非常有限的,诸如List、Map之类的集合类型都不能被注入。
  另一方面,EJB3.0的截获器可被看作是一种AOP模型,截获器类相当于方面(Aspect),而截获器方法相当于通知(Advice),但这种AOP是非常简单的:
    不支持引入(Introduction);
    不支持切入点(Pointcut)模式
    通过标注告诉容器某个EJB需要使用截获器,从而使得这种AOP模型具有一定的侵入性
分享到:
评论

相关推荐

    EJB3.0入门经典(PDF)

    《EJB3.0入门经典》是关于EJB 3.0的专业技术教程,从实用的角度出发,理论联系实际,用9章的篇幅详细讲解了EJB 3.0开发的方法和技巧。《EJB3.0入门经典》内容丰富,讲解由浅入深,全面系统,在讲解EJB 3.0最新开发...

    ejb3.0入门图文教程

    ejb3.0入门图文教程,包括EJB3.0开发Entity.pdf、EJB3.0开发Message Driven Bean.pdf、EJB3.0开发Session Bean.pdf

    精通EJB3.0 中文版 3/3

    罗时飞精通EJB3.0.zip.001 罗时飞精通EJB3.0.zip.002 罗时飞精通EJB3.0.zip.003 《精通EJB3.0》共分为4个部分:第一部分对EJB编程基础进行介绍,概要性地对EJB进行了阐述;第二部分重点关注EJB编程的具体内容和...

    精通EJB3.0 中文版 1/3

    罗时飞精通EJB3.0.zip.001 罗时飞精通EJB3.0.zip.002 罗时飞精通EJB3.0.zip.003 《精通EJB3.0》共分为4个部分:第一部分对EJB编程基础进行介绍,概要性地对EJB进行了阐述;第二部分重点关注EJB编程的具体内容和...

    ejb3.0实例教程

    绍之中,应用实例更是少之又少,所以作者拟写本书,以简单的实例展现 EJB3.0 的开发过程,希望对大家有所帮 助。 EJB3 最激动人心的是 POJO 编程模型,我想对开发人员的影响将是非常大的,因为他降低了开发人员编写 ...

    EJB3.0中文文档

    EJB3.0中文文档,实例教程.EJB3.0中文文档,实例教程.EJB3.0中文文档,实例教程.EJB3.0中文文档,实例教程.

    ejb3.0开发规范PDF

    ejb3.0开发规范,开发ejb3.0过程中的参考文档

    weblogic+ejb3.0例子

    weblogic+ejb3.0weblogic+ejb3.0weblogic+ejb3.0weblogic+ejb3.0weblogic+ejb3.0weblogic+ejb3.0weblogic+ejb3.0

    ejb 3.0 jar 包 很全 part1

    ejb 3.0 jar 包 很全ejb 3.0 jar 包 很全ejb 3.0 jar 包 很全ejb 3.0 jar 包 很全ejb 3.0 jar 包 很全ejb 3.0 jar 包 很全ejb 3.0 jar 包 很全

    EJB 3.0实例教程.pdf

    EJB 3.0实例教程.pdf EJB 3.0实例教程.pdf

    EJB 3.0从入门到精通

    本书面向EJB 3.0的实际应用开发,通过大量的实例,循序渐进地为读者介绍了有关EJB 3.0开发所涉及的各类知识。全书共分16章,内容依次包含了Java EE概述、EJB基础、搭建EJB环境、会话bean、持久化实体、持久化实体...

    EJB3.0之HelloWorld

    这是EJB3.0的第一个例子HelloWorld

    EJB 3.0入门经典 源码

    本书是关于EJB 3.0的专业技术教程,从实用的角度出发,理论联系实际,用9章的篇幅详细讲解了EJB 3.0开发的方法和技巧。  本书内容丰富,讲解由浅入深,全面系统,在讲解EJB 3.0最新开发技术的同时,精心设计了与...

    EJB3.0规范和EJB3.0经典入门(含源码)

    EJB3.0规范和EJB3.0经典入门(含源码) 本材料适合Java程序员、项目经理和系统架构师。学习本材料,您不需要EJB2.x知识,如果具备一些Web和jdbc知识,学习效率会更快些。学习本材料,初级Java程序员应在1个月左右,...

    EJB3.0入门经典源代码.part1

    本书是关于EJB 3.0的专业技术教程,从实用的角度出发,理论联系实际,用9章的篇幅详细讲解了EJB 3.0开发的方法和技巧。  本书内容丰富,讲解由浅入深,全面系统,在讲解EJB 3.0最新开发技术的同时,精心设计了与...

    2022年EJB 3.0开发指南之依赖注入Java教程.docx

    2022年EJB 3.0开发指南之依赖注入Java教程.docx

    ejb3.0开发实例(java工程)

    ejb3.0开发实例,会话bean开发,完整代码,适合入门学者

    精通EJB3.0 pdf

    精通EJB3.0 pdf

    EJB3.0规范-EJB3.0 SPECIFICATION

    EJB3.0规范 EJB3.0 SPECIFICATION 官方规范英文版

    ejb2.0与ejb3.0的区别

    ejb2.0 ejb3.0的区别,比较详细讲解两者的区别

Global site tag (gtag.js) - Google Analytics