背景:Weld 1.0.0發布與CDI標準化
Red Hat JBoss發布Weld 1.0.0——JSR-299(Contexts and Dependency Injection for Java EE,簡稱CDI)參考實現。GlassFish v3與JBoss AS 5.2內置Weld。關鍵突破:Weld不依賴完整應用服務器,可運行於Jetty 6.1/Tomcat 6/Servlet容器,甚至Java SE 5+環境(發布包含控制台/Swing演示)。
JSR-330(注入註解標準化)對CDI的影響
「CDI現使用JSR-330註解聲明注入點。影響微乎其微,因330模型與299大同小異,僅註解名稱不同。關鍵點:330未定義完整DI方案,僅定義帶修飾符的注入點,其他(作用域、攔截器、裝飾器、事件)均無涉及。」
CDI與EJB在Managed Bean模型下的統一
- Managed Bean規範源自JSR-299早期草案(「Simple Web Bean」),支援DI、EL命名、攔截器,無EJB編程約束
- 爭議:Red Hat主張需要普通類注入,其他專家反對新增EE組件
- 妥協:Managed Bean獨立成規範,作為所有EE組件編程模型基礎(含EJB)
- 現狀:EJB可視為特殊Managed Bean(額外約束+功能),大幅降低EE學習曲線
EJB是否仍需獨立組件模型?
「EE未來:將EJB專有功能(@TransactionAttribute、@RolesAllowed)通用化至所有Managed Bean。但EJB在消息端點、遠程/異步調用、定時器領域仍有不可替代價值,其生命週期模型在此場景極具意義。」
從Seam到CDI:JSF 2時代的新分工
- Seam 2大量精力填補JSF 1.x坑洞,無暇整合前沿表現層技術
- JSF 2修復核心缺陷,釋放Seam精力轉向高價值領域
- CDI三大使命:①聲明式上下文/狀態/生命週期管理 ②類型安全DI(類Guice) ③SPI支撐平台擴展性
CDI SPI:Java EE 6擴展性基石
「我們渴望技術以插件形式接入平台。通過擴展點與SPI,第三方技術能像內置設施一樣整潔高效地運行。」(JSR-316規範原文)
可移植擴展能力:
✓ 提供自定義Bean/攔截器/裝飾器
✓ DI注入服務至擴展對象
✓ 實現自定義作用域上下文
✓ 外部註解增強或提供基於註解的元數據
Seam 3:CDI生態的首個豐富擴展套件
- 核心引擎:CDI
- SPI擴展:BPM整合、Drools規則引擎、PDF/Email模板、Excel生成
- 可運行於任意JSR-299環境(含所有Java EE 6容器、Tomcat、Jetty、Resin)
Red Hat戰略:CDI/Seam作為所有項目和平台未來方向
「團隊正與ESB、SOA-P緊密合作確保Seam 3滿足特定需求。項目已視Seam為正確選擇,無需修改即可集成。」(Mark Little, JBoss CTO)
Gavin確認:Weld比Seam 2更專注、測試更完善的基礎設施,可應用於非Web構建場景。
多元化CDI實現生態
- Caucho Resin:CanDI實現,容器內部大量使用CDI
- Apache OpenWebBeans:社區驅動實現
- Granite DS:Flex RIA場景CDI實現,「JCDI極適合事件驅動Flex架構,Seam特性豐富但無需重複造RIA前端輪子」