前不久Red Hat的JBoss部門發布了Weld1.0.0——Java EE 6對JSR-299(Java EE的上下文與依賴注入,即Contexts and Dependency Injection for Java EE,後文簡稱為CDI)的參考實現。Sun GlassFish Application Server v3和即將發布的JBoss AS 5.2.0都使用了Weld實現,然而Weld並不需要完整的應用服務器。它可以運行在Servlet容器內如Jetty 6.1或是Tomcat 6,同時也能用於Java SE 5.0+。為了闡明後一點,Weld發布包中還帶有一個示例性的控制台應用及一個Swing應用示例。
在JSR-299草案首次發布後,Google與SpringSource又聯合提交了JSR-330,旨在標准化“一個久經考驗、無可辯駁的注解集以使得注入類能夠跨越多個框架”,因此在我碰到CDI規范的領導者Gavin King時就迫不及待地詢問他JSR-330對CDI有何影響。
CDI現在使用JSR-330所定義的注解來聲明注入點。這種影響是微乎其微的,因為330所使用的模型基本上與299大同小異。歸結起來,只是注解名有所區別罷了。InfoQ:CDI和EJB是如何處理EE 6所引入的Managed Bean模型的?
新的Managed Bean規范是JSR-299的工作成果(在規范的早期草案中我們稱之為“簡單Web Bean”)。簡單Web Bean支持依賴注入、EL名字與攔截器,但卻沒有EJB那些編程約束。InfoQ:EJB還需要自己的組件模型麼?
我認為EE平台的未來發展方向是逐漸將EJB特有的功能通用化,將其應用在所有的Managed Bean上。舉個例子,為何不是所有的Managed Bean都支持@TransactionAttribute和@RolesAllowed呢?簡直沒有道理嘛。InfoQ:Seam為JSF 2和CDI創造了靈感。在JSF中修復這些問題要比在Seam中解決好在哪呢?
在盡力透明化用戶體驗的過程中,我們從來都沒有真正滿意過。用戶總是注意到何時在使用JSF的特性,何時在使用本應放在JSF中的Seam特性。CDI來源於Red Hat的開源Seam框架,從廣義上來講,它將Seam的編程模型標准化為Java EE 6的編程模型。CDI實現了Java EE 6的3個主要目的。首先,它提供了聲明的方式來管理綁定到上下文組件的范圍、狀態與生命周期。其次,它為平台提供了標准化、注解驅動、類型安全的依賴注入框架,方式類似於Google Guice。最後,它為Java EE平台的擴展開發提供了Service Provider Interface(SPI)。
CDI的Service Provider Interface已經成為Java EE可擴展性的一個關鍵組成部分,而可擴展性則是Java EE 6的一個中心議題。JSR-316規范說到:
...我們相信大家都很渴望將這些技術用於Java EE應用服務器之上,或是以插件的形式使用。通過增加更多的擴展點和服務供應商接口,其他技術就可以插件的形式用於平台實現了,這麼做既整潔又高效,對於開發者來說使用起來也是非常簡單的,就像是內置於平台上的設備一樣。這一點大家可以從下一版的Seam(也就是Seam 3)中看到,Seam 3將CDI作為其核心引擎並使用CDI Service Provider Interface提供了CDI中並沒有涵蓋的眾多特性,如BPM集成、Drools集成、PDF與Email模板支持以及Excel生成等等。這些擴展(也包括第三方廠商提供的其他擴展)可以運行在支持JSR-299的任何環境中,也包括任何Java EE 6環境。CDI規范說到:
可移植的擴展可以通過如下方式與容器集成:Gavin King說到:
CDI和JSF 2的出現預示了Seam的新方向。JBoss CTO Mark Little說CDI和Seam將是其所有項目和平台的未來發展方向:
目前團隊正與這些項目和平台(如ESB和SOA-P)緊密合作以確保新版Seam能考慮到其特定的需求。重要的是,一些項目已經認為Seam是其正確的選擇,甚至都不用做任何修改,因此緊密與快速的集成要比想象的更容易一些。King也確認了這一點並說到:
Red Hat已經成功將Seam應用到其所開發的一些項目當中了。CDI將Seam的核心功能放在了堅固的根基之上,而我們對CDI的實現Weld是個更加專注且測試良好的基礎設施。這意味著我們可以將Weld應用在Seam 2不適合的各種領域中,而這與構建Web站點無關。除了Red Hat外還有很多其他的CDI實現也即將破繭成蝶。Resin的創建者Caucho Technology擁有一個實現(CanDI),而Resin容器本身也在內部大量使用了CDI。apache也正致力於一個名為OpenWebBeans的實現,Granite DS也有一個實現,可以將CDI應用在Flex應用中,如下:
我們認為JCDI非常適合於事件驅動架構的Flex RIA。JCDI應用非常整潔,盡管JBoss Seam提供了大量的特性,但他們沒必要再開發一個RIA前端了。