Java EE 6中最惹人注意的就是上下文和依赖注入规范(Context and Dependency Injection, CDI)-JSR299。
其中最重要的概念是Managed Bean。没错,就是这个称谓。有的开发者可能会问:先前JSF规范中不就有Managed Bean么?Java EE 6中的Managed Bean和JSF1.0中Managed Bean有本质区别。JSF1.0为了和业务层打交道,必须留个尾巴出来和EJB打交道,认为添加了Managed Bean/Backing Bean一层。而这层是完全不必要的,是胶水代码。熟悉JBoss Seam的开发者很能体会JBoss Seam组件是如何干掉Managed Bean直接在表现层使用EJB的(当然前提是这些EJB被声明为Seam组件)。
Java EE 6中的ManagedBean就好像JBoss Seam的组件一样,试图一统Java EE模型。也就是说,EJB也可以通过@ManagedBean注释声明为ManagedBean, 开发者不用写胶水代码了。
有了Managed Bean就不用EJB了么?当然不是,ManagedBean根本不管事务,安全,消息,远程访问等方面的事情。这些还要靠EJB。
上下文的管理也就是状态的管理是CDI最核心的部分, Gavin King一直强调CDI不仅仅是所谓的依赖注入!估计是和JSR330的Lead Rod Johnson又干上了。平心而论,我很怀疑Rod Johnson加入Java EE专家组的动机,这家伙除了搞了一个JSR330之外没啥事,而且开发者可以看一下JSR330:啥也没有,只有一堆抽象的接口定义,晕倒!Spring是来捣乱的啊。
无论如何,上下文的管理是Spring所没有的,因为Spring是无状态框架。而Gavin King极力鼓吹JBoss Seam这样的有状态框架。对于开发者来说,说实话,我从来没有见过完全无状态的应用, Google Search是个例外:).
CDI定义的Scope如下:
- Dependent, 顾名思义,注入的Bean的范围依赖于目标Bean
- ApplicationScoped, 和Servlet的Application对应
- RequestScoped, 和Servlet的HTTP Request对应
- SessionScoped, 和Servlet的HTTP Session对应
- ConversationScoped, 熟悉JBoss Seam的开发者不会陌生吧?JBoss Seam最大的创新之处之一!