1. 引言
此教程講述DI(依賴註入),並且涵蓋瞭CDI(上下文依賴註入)的一些特性,比如類型安全註解配置、替換選擇等內容。
CDI是依賴註入(DI)和攔截(AOP)的Java標準規范。DI和AOP有著很高的知名度,Java需要處理DI和AOP以便在此之上構建其它的標準。DI和AOP是很多Java框架的基礎。
CDI是JavaEE 6的基礎。它很快就得到瞭Cauchos Resin、IBMs WebSphere、Oracles Glassfish、Red Hats JBoss和眾多應用服務器的支持。CDI與Spring和Guice框架非常相似,就像JPA很像ORM。CDI簡化瞭對於DI和AOP的API。如果你使用過Spring或者Guice,你會發現CDI更容易學習和使用。如果你是依賴註入(DI)的新手,那麼CDI能讓你迅速理解DI。CDI更容易學習和使用。
CDI能夠獨立使用也能嵌入的任何應用中。
這個教程在發佈三年之久的Spring 2.5 DI 教程(使用Spring “new” DI 註解)之後出現並不奇怪。它將有趣的對比三年前縮寫的Spring DI註解。
2. 本教程設計目標
本教程的目標是描述和解讀不包含復雜的EJB3.1和JSF的DI和CDI。
CDI的優勢是能夠在EJB和JSF之外。本教程隻關註CDI。再次聲明在本教程中沒有JSF2和EJB3.1的內容。很多文章和教程都涵蓋如何使用CDI(JEE6規范)。本教程並不是,這裡隻是CDI。
本教程有完整的代碼示例,你可以下載試用。
我們將放緩速度,逐步的從基礎開始。一旦你理解瞭基本原理,我們會適當的加快腳步。
所有的示例代碼都以確保能夠運行。我們不會鍵入臨時代碼,如果代碼不能運行,那它就不屬於本教。
示例代碼都有清晰的標題,所以你可以把教程看做一個菜單,將來你如果想使用CDI DI的某些特性,可以方便的在菜單目錄中查找示例。
裝飾器、擴展、攔截器、范圍都不在本教程的范圍之內。
如果這個教程通過google討論組收到足夠的反饋和評論,我將加入CDI AOP(裝飾器和攔截器)綜合教程還有擴展。
更多的建議和反饋會鼓舞我做的更好。
3. 依賴註入
依賴註入(DI)是為軟件組件提供擴展依賴的過程。DI能夠讓你的代碼架構很簡潔。
它幫助你用測試驅動開發的方式設計接口,提供統一的方式註入依賴。例如,一個數據訪問對象(DAO)可能依賴一個數據庫連接。
取而代之,使用JNDI查找數據庫連接,你不需要註入它。
考慮到JNDI是徹底的翻查,DI框架取代對象查找其它準備好的對象(依賴的),一個DI容器能註入這些依賴的對象。這被成為“好萊塢原則”,“不要給我打電話(查找對象),我會打給你(註入對象)”。
如果你接觸過CRC卡,你能想象出一個依賴就像一個合作者。一個合作者是一個對象,另一個對象需要R