前言
与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 源码 源代码"可能包含的是李腾飞教授或团队关于EJB 3.0技术的实践示例或教学资源。通过分析这些源码,开发者可以深入理解EJB 3.0的实现细节,例如如何使用注解定义Bean、如何处理持久化、如何进行依赖...
EJB 3.0引入了依赖注入(DI)的概念,允许容器管理Bean的依赖关系,降低了组件间的耦合。`@EJB`、`@Inject`和`@Resource`注解分别用于注入EJB、CDI(Contexts and Dependency Injection)组件和资源。 6. **事务...
3. **依赖注入(Dependency Injection)**:EJB 3.0支持JSR 330规范,通过@Autowired、@Inject等注解实现依赖注入,降低了组件间的耦合度,提高了代码的可测试性和可维护性。 4. **会话Bean**:会话Bean是EJB的核心...
EJB 3.0是EJB规范的一个重大革新,它极大地简化了EJB的开发过程,引入了许多面向开发者友好的特性,如注解、依赖注入以及更轻量级的架构。 **1. 注解驱动的开发** 在EJB 3.0之前,开发者需要编写大量的XML配置文件...
在整个学习过程中,你将了解到EJB 3.0的核心概念,如依赖注入、容器管理的事务、安全性和性能优化。这些知识对于理解和构建企业级Java应用程序至关重要。同时,EJB 3.0的可读性强和简洁的编程模型也使其成为开发者...
《EJB3.0入门经典》是关于EJB 3.0的专业技术教程,从实用的角度出发,理论联系实际,用9章的篇幅详细讲解了EJB 3.0开发的方法和技巧。《EJB3.0入门经典》内容丰富,讲解由浅入深,全面系统,在讲解EJB 3.0最新开发...
在"ejb3.0入门经典教程-source"这个压缩包中,包含了书中各个章节的示例代码,覆盖了EJB 3.0的各个方面,例如实体Bean的创建、会话Bean的使用、事务管理、安全性设置以及JPA的持久化操作等。这些源码对于初学者来说...
### Java之精通EJB3.0 #### 一、EJB3.0简介与改进 企业Java Beans(Enterprise JavaBeans,简称EJB)是Java平台为企业级应用开发提供的一种组件模型。EJB3.0是EJB规范的一个重大版本更新,它在EJB2.0的基础上进行...
综上所述,ejb3.0规范PDF包含了大量的信息,从配置简化到实体Bean的JPA集成,再到会话Bean、消息驱动Bean的使用,以及依赖注入、接口驱动编程、事务管理和安全性等多个方面,为Java EE开发者提供了全面的指导。...
EJB3.0最显著的改变之一是引入了对注解的支持,这使得开发者可以在类和方法上使用注解来声明EJB的属性和配置,从而极大地简化了EJB组件的创建过程。例如,可以使用`@Stateless`、`@Stateful`和`@Singleton`注解来...
5. **依赖注入(Dependency Injection)**:EJB 3.0利用JSR 299(CDI,Contexts and Dependency Injection)提供依赖注入功能,使得Bean之间可以通过注解进行依赖关系的声明,减少硬编码的依赖。 ejb-3_0-fr-spec-...
4. **依赖注入(Dependency Injection)**:EJB3.0引入了JSR 299(现在是CDI,Contexts and Dependency Injection for the Java EE Platform)规范,允许通过注解来声明Bean之间的依赖关系,如@Autowired和@Resource...
8. **依赖注入(Dependency Injection, DI)**:EJB 3.0支持JSR 330规范,通过注解实现服务的自动装配,如`@Inject`,使得bean之间的依赖关系更加清晰,降低了代码的耦合度。 9. **异步方法调用**:EJB 3.0允许会话...
4. **依赖注入(Dependency Injection, DI)**:EJB3.0引入了依赖注入,使得组件之间的依赖关系可以通过注解自动管理,比如`@EJB`、`@Inject`等,降低了组件间的耦合度。 5. **Java Persistence Query Language ...
4. **依赖注入(Dependency Injection)**:EJB 3.0支持Java EE的依赖注入机制,使得组件之间可以通过容器管理的依赖关系进行协作。例如,`@EJB`、`@Inject`和`@Resource`注解可用于注入其他Bean或资源。 5. **事务...
在"**EJB3.0+JBOSS+MyEclipse初体验(完整代码和过程).txt**"文件中,你将找到一个完整的示例,涵盖了上述所有步骤,包括具体的代码片段和执行过程,这对于初学者来说是一个很好的起点,可以快速理解并实践EJB 3.0在...
- EJB3.0和Spring都实现了依赖注入,允许对象在运行时自动获得其依赖,提高模块化和测试性。EJB3.0通过注解完成,而Spring可以通过XML、注解或Java配置实现。 综上所述,EJB3.0倾向于标准化、高度集成,强调厂商...
在《中文最新EJB3.0实例教程》中,你将学习如何创建和部署EJB3.0组件,如何使用JPA进行数据持久化,以及如何利用依赖注入和事务管理构建可扩展和可靠的业务应用。教程中可能包含实际的项目案例,通过实践操作来加深...
### EJB2.0与EJB3.0的主要区别 #### 一、简介 企业Java Beans(EJB)是Java平台为企业级应用提供的一种组件模型。随着技术的发展,EJB经历了多个版本的迭代,其中EJB 2.0和EJB 3.0是两个重要的里程碑版本。本文将...
**电子书-EJB3.0实例教程** EJB(Enterprise JavaBeans)是Java平台企业版(Java EE)的一部分,主要用于构建可复用的、模块化的、面向服务的企业级应用程序。EJB 3.0是其重要的一个版本,它在EJB 2.x的基础上进行...