Matt Corey 写道
唉,自从我开始关注Java EE 6的新特性,已经有一段时间了,部分原因是因为我一直在研究Java EE组合中的最新成员——JSR-299,也就是CDI,之前被称为Web Beans,这个新特性可能会非常重大...让我们来个大新闻——CDI最终可能会使EJB变得无足轻重...
好消息是,Matt似乎对CDI持好感。坏消息是,目前对于CDI和新的托管Bean规范如何影响EJB的未来仍存在疑问。
Matt继续说道
我相信,CDI有潜力提供EJB规范中提供的所有最常用服务,包括事务、定时器、与MDB的异步处理,以及现在的Singleton启动Bean。
我的看法略有不同。首先,重要的是要理解没有所谓的“CDI Bean”。CDI适用于任何托管Bean。有些托管Bean是EJB。当我们需要在托管Bean中使用EJB服务时,我们只需添加一个@Stateless, @Stateful或@Singleton注解,然后就可以继续了。不过,如果我们只是想为Bean添加声明式安全或事务管理,似乎没有必要强制要求这个生命周期注解。
目前我的观点是,我们可以将EJB规范定义的功能分为两大类
- 一类是对于作为应用程序入口点的组件最有意义的函数——通过RMI、HTTP或面向消息的中间件提供的远程调用的端点,
- 另一类是应该提供给作为应用程序内部实现部分的Bean的功能。
在第一类中,我包括以下内容
- 基本无状态/有状态/单例的生命周期模型,这对于入口点来说一直是最有意义的,
- 远程和Web服务端点接口,以及
- 消息驱动Bean。
在第二类中,我会放入
- 声明式并发管理,
- 声明式事务管理,以及
- 声明式安全。
尽管这些功能在系统入口点最有用,但它们在更细粒度级别也是必要的。它们对于非EJB的入口点也是必要的——例如,Servlet。因此,我认为Java EE 7很可能将这些特性推广到所有Java EE组件。这正是我们将要争论的。
如果EE 7确实朝这个方向发展,你将在许多目前需要EJB的情况下使用普通的托管Bean,EJB本身在EE架构中将承担更明确的角色。EJB将是定义远程和异步调用端点编程模型的规范。很可能会在这个更专注的身份下,EJB将是一种更易于管理的技术。
当然,还有一些东西不适合这两个类别中的任何一个。我最怀疑的是定时器和异步方法。也许可以将它们推广到所有托管Bean,但对我来说,并不清楚是否有真正的需求。