JSR-299 规范原来叫做 Web Beans,其主要目的是为了整合 JSF 和 EJB。到 2009 年">正式发布该规范时,JSR-299 已经改称 “Contexts and Dependency Injection for the Java EE platform”(简称 CDI ),整合 JSF 和 EJB 仍是其目的,但这并非 CDI 的唯一功能。
通读 JSR-299 规范的文本,描述最多的是依赖注入(Dependency Injection, DI ) 容器。CDI 的 DI 有与众不同之处,它的第一个字母 C,代表 Contexts,是上下文环境,也是范围。CDI 注入的对象必须与某个 Context 关联,其生命周期与 Web 应用的各个范围息息相关。
本教程适合的读者对象
阅读本教程的读者需具备以下基础:
熟悉
Servlet 开发。示例的应用逻辑比较简单,有了 Servlet 编程基础就能看懂。 熟悉 JPA 开发。需要对 Persistence Context 和 Entity Manager 有一定了解。 熟悉 Maven 工具。本教程的示例应用配置了 pom.xml,对初次接触 Maven 的读者,第一次更新依赖库时可能会有较多的问题,需要了解 Maven 的基本操作才能解决。 了解 Spring IoC。教程中经常会比较 CDI 和 Spring IoC,不熟悉 Spring IoC 的读者可略过这些内容。
本教程的内容选择
本教程探讨了在 Servlet 环境中使用 CDI,没有用到 JSF 和 EJB。这么做主要是出于下面的考虑:
JSF 对 Servlet 封装得很深,在处理各个范围时不如 Servlet 来得直观。 Servlet 是每个 Java Web 开发者必备的知识技能,熟悉 JSF 的开发者相对较少。 Servlet 环境中使用 CDI
复杂度较低,结合了 JPA 后,也能实现 JSF + EJB 组合的许多重要特性。 起草中的 JSR-346,即 CDI 1.1 规范,增强了对 Servlet 的支持力度。
本教程的内容组织
本教程基本遵照项目驱动的方式来组织知识点,所用的示例应用实现了雇员信息的查看和修改。涉及的 CDI 功能包括:
CDI 作为依赖注入容器的特点和用法。 用 CDI 实现声明式事务管理。 用 CDI 实现在 Session 范围里共享 Persistence Context。 监听 CDI 容器的事件。
开发环境配置
下面列出示例应用所用开发环境及工具软件的版本:
Tomcat,版本 7.0.28。 Eclipse Java EE IDE for Web Developers,版本 Indigo SR2。 Maven,版本 3.0.4。
Maven 配置
示例应用用到了 Weld 和 Hibernate,使用 Maven 来管理项目,需要添加 JBoss Public 仓库和相关依赖项,pom.xml 中相关配置代码如清单 1 所示。
清单 1. pom.xml 配置代码片断
<repositories> <repository> <id>jboss-public-repository-group</id> <name>JBoss Public
Repository Group</name> <url>http://repository.jboss.org/nexus/content/groups/public/</url> <layout>default</layout> … </repository> </repositories> <dependencies> <dependency> <groupId>org.jboss.weld.servlet</groupId> <artifactId>weld-servlet-core</artifactId> <version>1.1.8.Final</version> </dependency> <dependency> <groupId>org.jboss.weld</groupId> <artifactId>weld-core</artifactId> <version>1.1.8.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>4.1.4.Final</version> </dependency> … </dependencies>
初次下载工程以后,可到工程目录下执行:mvn dependency:resolve,让 maven 下载相关依赖包。
Eclipse 工程配置
默认情况下,用 maven 创建的工程会把 Web 资源放到 src/main/webapp 目录下,为了在 eclipse 环境中调试 Web 应用,需要配置工程属性。在 Eclipse 的 Project 菜单中点击 Properties,打开工程配置界面,找到 Deployment Assembly 选项,具体配置如图 1 所示。
图 1. eclipse 工程配置图