利用CDI和JPA开发Servlet应用2013-12-16 ibm 吕焱飞开始之前关于 CDIJSR-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 下载相关依赖包。