開始之前
關於 CDI
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 下載相關依賴包。