JEE6 CDI(Contexts and Dependency Injection)介紹

    Java EE 6已經發布了好久,不過國內使用的人依舊不多,資料也很缺少。我本身本人很看好JEE6,以爲 JSR299- Contexts and Dependency Injection 很好很強大。CDI 也就是上下文依賴注入,概念和 Spring 中的 依賴注入(DI) 同樣。在JEE6中被做爲一個規範後,咱們使用起來就更加的方便實用了。html

    CDI最給力的一點就是提供了一個 Extension接口, 容許咱們對CDI進行擴展。咱們能夠經過實現這個接口來作實現不少很是酷的功能。包括對 Bean 的注入先後的攔截,Bean執行構造方法先後的攔截等等。經過這些咱們就能夠實現事務,日誌等等一些功能。前端

    目前實現 JSR-299 CDI 規範的框架有三個:  JBoss Weld   Apache OpenWebBeans 和 Caucho CanDI 。JSR-299 CDI 是 Gavin King 領導制定的,Weld 的實現也基本是由 JBoss的人員完成,因此JBoss社區比較活躍。java

    CDI 做爲一個依賴注入的規範,它的主要的優勢有下面幾點:web

  • 類型安全:CDI不在經過字符串名稱來注入對象,而是java類型來肯定被注入的對象。當單單經過java類型還不能肯定到底哪個對象被注入的時候,你能夠經過擴展 @Qualifier  註解來限定你須要注入的對象

  • 普通的Java Bean :在CDI中基本上全部的 Java Bean 均可以被注入。固然包括:EJB、JNDI資源、持久化單元、持久化上下文、接口等等。

  • 可擴展性:就像上面說到的,每個 CDI 容器你均可以經過實現 Extension 接口來擴展一些功能。

  • 攔截器:CDI提供了一個十分方便的方法來實現攔截器功能。

  • 裝飾器:裝飾器可讓你動態的擴展或者重寫現有的業務接口。這個功能十分方便,在CDI中,你在調用一個接口的實現類的時候,無須關係這個實現類的名稱,因此在你更換新的實現的時候無需去修改你的代碼,只須要在新的接口上面經過裝飾器聲明你要替換的以前的接口實現,而後在 Bean.xml 中聲明一下便可。

  • 事件:CDI 提供了一種鬆耦合性的事件發送和接受機制。好比,在用戶登錄後,咱們須要在Session中存放一些用戶信息。有了這個機制,咱們不須要在登錄的那個方法中 經過new一個Session範圍的對象或者把一些數據放入Session中,這樣修改這些方法的時候,咱們就得去修改這個登錄方法的。或者說 咱們忽然須要在用戶登錄後,額外作一些事情,咱們又得去修改登錄這塊的代碼。  在CDI中,咱們能夠在登錄成功後,發送出一個登錄成功的事件,而後咱們能夠在任何類中來接受這個事件,來完成對應的工做。 是否是很酷 :-)

  • EL表達式的擴展:CDI中默認支持EL表達式並對其進行了擴展,好比在JSF中,默認是不支持EL表達式傳參的,若是結合CDI,那麼就能夠在EL表達式中傳參數給後臺Bean。

    就目前而言,CDI仍是很JSF結合使用的比較多,固然也有 Zk-CDI 等一些前端框架的擴展,也能夠經過對CDI的擴展也能夠實現相似於Spring-MVC 結合JSP使用。對於國內依然是Spring+JSP的天下,對於我這樣一直在使用JSF的人來講非常無奈。我本人一直以爲JSF的開發效率要比JSP高,對於普通的開發人員只需掌握JSF便可,不過前提須要一個成熟的框架。國內不少java web開發者對JSF 都比較排斥,目前JSF已經2.2了,之前的許多問題都已經解決,在看看Primefaces, RechFaces 這些強大的控件庫。我以爲 JSF 已經值得咱們去學習使用了。apache

    開始 CDI

    咱們開始搭建一個CDI的工程,下載 Eclipse3.7.2 ,而後安裝對應的 JBossTools 插件,而後下載 JBoss-as-7.1.0.Final 。JBoss As裏面已經集成了 JSF,Weld模塊,因此使用Jboss做爲服務器是十分方便的。
安全

    建立一個 Dynamic Web Project 3.0 的工程,而後爲工程添加 CDI 的支持。添加CDI的支持是爲了可以在EL表達式中Eclipse能夠有代碼提示。這樣咱們就搭建好了 Weld+JSF的工程,很方便吧 :-)
前端框架

    編寫Action代碼:服務器

import javax.enterprise.context.RequestScoped;
import javax.inject.Named;

@Named
@RequestScoped
public class HelloCDIAction {

	public String getHelloWord(){
		return "Hello Word";
	}
}

編寫JSF頁面代碼:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"> 

<h:head></h:head> 
<body> 
	<h:outputText value="#{helloCDIAction.helloWord}" />
</body> 
</html>

而後部署,訪問 http://localhost:8080/CDIDemo/Main.face 

 

    後面會繼續寫一些有關 CDI 介紹的文章,結合JSF + Primefaces 給出一些 Demo。 app

相關文章
相關標籤/搜索