日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
面向JavaEE6平臺(tái)的上下文和依賴性注入

【精選譯文】Java EE 6平臺(tái)的發(fā)布帶來(lái)了幾個(gè)新的技術(shù)亮點(diǎn)。在前幾周,我們介紹了Java EE平臺(tái)的主要目標(biāo)以及Java EE 6的RESTful Web Services Java API (JAX-RS)特性,本文將介紹面向Java EE平臺(tái)的上下文和依賴性注入(CDI)。

創(chuàng)新互聯(lián)是一家專業(yè)提供余杭企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、H5響應(yīng)式網(wǎng)站、小程序制作等業(yè)務(wù)。10年已為余杭眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。

JSR 299是一種為Java EE組件提供強(qiáng)大服務(wù)的技術(shù),這些服務(wù)允許Java EE組件,包括EJB會(huì)話Bean和JavaServer Faces(JSF)托管的Bean,綁定到生命周期上下文,注入,并以松耦合的方式交互。最重要的也許是,CDI統(tǒng)一和簡(jiǎn)化了EJB和JSF編程模型,允許企業(yè)Bean替換JSF應(yīng)用程序中JSF托管的Bean。

本質(zhì)上,CDI是Java EE平臺(tái)的Web層和企業(yè)層之間的一座橋梁,企業(yè)層通過(guò)如EJB和JPA等技術(shù),已經(jīng)對(duì)事務(wù)性資源提供了強(qiáng)有力的支持。例如,使用EJB和JPA(編輯推薦:EJB應(yīng)用開(kāi)發(fā)專欄),你可以輕松構(gòu)建與數(shù)據(jù)庫(kù)交互的應(yīng)用程序,在數(shù)據(jù)上提交或回滾事務(wù),以及持久化數(shù)據(jù)。相比之下,Web層重點(diǎn)是展示。Web技術(shù)如JSF和JSP提供用戶界面,顯示它的內(nèi)容,沒(méi)有集成處理事務(wù)資源的工具。編輯推薦您閱讀《Java EE 6平臺(tái)指南》專題了解更多。

通過(guò)它的服務(wù),CDI使Web層也支持事務(wù),這樣在Web應(yīng)用程序中訪問(wèn)事務(wù)資源就更容易了。例如,CDI使得構(gòu)建一個(gè)用JPA提供的持久化訪問(wèn)數(shù)據(jù)庫(kù)的Java EE Web應(yīng)用程序就更容易了。

讓我們?cè)倏纯词褂肅DI服務(wù)的Web應(yīng)用程序的關(guān)鍵部分,處理用戶登錄和注銷的應(yīng)用程序同時(shí)包括JSF和EJB組件。下面是一個(gè)顯示登錄提示JSF頁(yè)面中的輸入窗體代碼:

 
 
 
  1.  
  2.         
  3.             
  4.               Username: h:outputLabel> 
  5.                
  6.               Password: h:outputLabel> 
  7.                
  8.             h:panelGrid> 
  9.             
  10.             
  11.         h:form> 
  12.     f:view> 
  13.  

你可以從代碼中看到,登錄提示顯示區(qū)域包括輸入用戶名和密碼,同時(shí)還顯示了一個(gè)登錄按鈕和退出按鈕。注意統(tǒng)一表達(dá)式語(yǔ)言(EL)表達(dá)式,如#{credentials.username}和#{login.login},這些表達(dá)式引用了名叫credentials 和 login的Beans。

請(qǐng)注意CDI是構(gòu)建在Java EE 6引入的新概念托管Beans之上的,其目的是統(tǒng)一Java EE 6中所有類型的Beans。一個(gè)托管Bean就是一個(gè)Java類,被視為由Java EE容器托管的組件,另外,你可以為其指定一個(gè)與EJB組件同名的命名空間,一個(gè)托管Bean也可以依賴少量的容器提供的服務(wù),主要與生命周期管理資源注入有關(guān),其它Java EE技術(shù),如JSF,EJB和基于托管Bean構(gòu)建的CDI,一個(gè)JSF托管Bean添加到生命周期范圍,一個(gè)EJB會(huì)話Bean添加如支持事務(wù)的服務(wù),CDI添加入依賴性注入的服務(wù),在CDI中,一個(gè)托管Bean或一個(gè)簡(jiǎn)單的Bean是可以被其它組件,關(guān)聯(lián)的上下文或通過(guò)EL表達(dá)式注入的Java EE組件。

使用javax.annotation.ManagedBean注解或CDI注解,如范圍注解或限定注解,注解它的類來(lái)聲明一個(gè)托管Bean,后面將會(huì)介紹范圍注解和限定注解?;谧⒔獾木幊棠P褪沟靡粋€(gè)Bean開(kāi)始是一個(gè)POJO,然后又轉(zhuǎn)換成另一種Java EE組件,如EJB組件成為可能,也許要使用更高級(jí)的功能,如事務(wù)和安全注解,或由EJB容器提供的實(shí)例,例如,你可以向?qū)ο筇砑右粋€(gè)@Stateful注解將一個(gè)POJO轉(zhuǎn)換成一個(gè)狀態(tài)會(huì)話,使用CDI的客戶端訪問(wèn)Bean不受影響,因?yàn)镻OJO已經(jīng)轉(zhuǎn)換成EJB了。

這里列舉的應(yīng)用程序中,一個(gè)名叫Credentials的Bean有一個(gè)綁定到JSF請(qǐng)求的生命周期,Credentials Bean是象下面這樣實(shí)現(xiàn)的一個(gè)JavaBean:

 
 
 
  1. @Model 
  2.    public class Credentials {  
  3.  
  4.       private String username;  
  5.       private String password;  
  6.  
  7.       public String getUsername() { return username; }  
  8.       public void setUsername(String username) { this.username = username; }  
  9.  
  10.       public String getPassword() { return password; }  
  11.       public void setPassword(String password) { this.password = password; }  
  12.    }  
  13.  

為了請(qǐng)求一個(gè)CDI服務(wù),可以使用CDI注解注解一個(gè)Java EE組件,@Model注解是一個(gè)CDI注解,它將Credentials Bean作為模型-視圖-控制器(MVC)架構(gòu)中的模型對(duì)象,內(nèi)置于CDI中的注解是一種固定模式的注解,固定模式注解將類標(biāo)記為滿足應(yīng)用程序內(nèi)的特定角色。

應(yīng)用程序還包括一個(gè)Login Bean,它的生命周末是和HTTP會(huì)話綁定到一起的,Login Bean是作為一個(gè)EJB狀態(tài)會(huì)話Bean實(shí)現(xiàn)的,代碼如下:

 
 
 
  1. @Stateful 
  2.    @SessionScoped 
  3.    @Model 
  4.    public class Login {  
  5.  
  6.       @Inject Credentials credentials;  
  7.       @Inject EntityManager userDatabase;  
  8.  
  9.       private User user;  
  10.  
  11.       @TransactionAttribute(REQUIRES_NEW)  
  12.       @RolesAllowed("guest")  
  13.       public void login() {  
  14.          ...  
  15.       }  
  16.  
  17.       public void logout() {  
  18.          user = null;  
  19.       }  
  20.  
  21.       public boolean isLoggedIn() {  
  22.          return user!=null;  
  23.       }  
  24.  
  25.       @RolesAllowed("user")  
  26.       @Produces @LoggedIn User getCurrentUser() {  
  27.          ...  
  28.       }  
  29.    }  
  30.  

@Stateful注解是一個(gè)EJB注解,它指定這個(gè)Bean是一個(gè)EJB狀態(tài)會(huì)話Bean,@TransactionAttribute 和@RolesAllowed也是EJB注解,它們聲明EJB事務(wù)劃分和注解方法的安全屬性。

@SessionScoped注解是一個(gè)CDI注解,它給Bean指定一個(gè)范圍,所有的Bean都有一個(gè)范圍確定其實(shí)例的生命周期和這個(gè)實(shí)例對(duì)其它Bean的實(shí)例是否可見(jiàn),這是一個(gè)很重要的特性,因?yàn)镋JB組件沒(méi)有定義良好的范圍,尤其是EJB組件不能感知請(qǐng)求,會(huì)話和應(yīng)用程序Web層組件,如JSF托管Bean的上下文,也不能訪問(wèn)與這些上下文關(guān)聯(lián)的狀態(tài)。此外,狀態(tài)EJB組件的生命周期不能作用到Web層上下文。

相比之下,CDI中的作用域?qū)ο笥幸粋€(gè)定義良好的由Java EE容器托管的生命周期上下文,作用域?qū)ο罂赡苁前葱枳詣?dòng)創(chuàng)建的,當(dāng)上下文創(chuàng)建完畢后又自動(dòng)銷毀的,值得注意的是,作用域狀態(tài)在相同上下文中執(zhí)行的客戶端之間是自動(dòng)共享的,這意味著客戶端,如其它在相同上下文中執(zhí)行的Beans,會(huì)被當(dāng)作相同的對(duì)象實(shí)例看待,但在不同上下文中的客戶端看到的是不同的實(shí)例。@SessionScoped注解指定Login Bean的作用域類型是會(huì)話作用域。對(duì)象通常不會(huì)與作用域關(guān)聯(lián),一般依賴于它們的所有者,這些依賴對(duì)象的生命周期是和它們的所有者聯(lián)系在一起的,一個(gè)依賴對(duì)象當(dāng)它的所有者被銷毀后它也自動(dòng)銷毀。

Beans通常通過(guò)依賴性注入引用其它Beans,依賴性注入機(jī)制是一個(gè)完全的類型安全,CDI使用JSR 330-Java依賴性注入中指定的注解進(jìn)行依賴性注入,@Inject就是其中一個(gè)注解,它指出Java類或接口上哪個(gè)依賴點(diǎn)可以被注入,容器然后提供需要的資源,在這個(gè)例子中,Login Bean指定了兩個(gè)注入點(diǎn),第一個(gè)使用@Inject注解在Credentials Bean上注入一個(gè)依賴,容器將會(huì)把Credentials Bean注入到這個(gè)上下文中創(chuàng)建的所有Login實(shí)例上,第二個(gè)@Inject注解在JPA EntityManager上注入一個(gè)依賴,容器將會(huì)注入EntityManager管理持久化上下文。

@Produces注解將getCurrentUser()方法認(rèn)為是一個(gè)生產(chǎn)者方法,每當(dāng)系統(tǒng)中的另一個(gè)Bean需要指定類型的注入對(duì)象時(shí)就會(huì)調(diào)用生產(chǎn)者方法,在這個(gè)例子中,注入對(duì)象是當(dāng)前登錄的用戶,它是通過(guò)限定注解@LoggedIn注入的,為了使用限定注解,你首先需要將它的類型定義為一個(gè)限定器,再使用@Qualifier注解,如:

 
 
 
  1. @Target( { TYPE, METHOD, PARAMETER, FIELD })  
  2.    @Retention(RUNTIME)  
  3.    @Documented 
  4.    @Qualifier 
  5.       public @interface LoggedIn {...}  
  6.  

#T#讓我們?cè)倩氐角懊嬗懻摰牡卿浱崾?,?dāng)用戶響應(yīng)提示并點(diǎn)擊了提交按鈕后,CDI技術(shù)開(kāi)始付諸行動(dòng),Java EE容器(編輯推薦:Java EE容器調(diào)查:Tomcat大受歡迎 WebLogic成時(shí)間殺手)自動(dòng)實(shí)例化Credentials Bean和Login bean的一個(gè)上下文實(shí)例,一個(gè)綁定上下文的Bean的實(shí)例叫做上下文實(shí)例,JSF指定輸入給Credentials Bean上下文實(shí)例的用戶名和密碼,接下來(lái)JSF調(diào)用Login上下文實(shí)例中的login()方法。這個(gè)實(shí)例對(duì)于相同HTTP會(huì)話中的其它請(qǐng)求繼續(xù)存在并可繼續(xù)使用,并為其它請(qǐng)求它的Bean提供表示當(dāng)前用戶的User對(duì)象。

這個(gè)例子只說(shuō)明了這個(gè)技術(shù)的一部分功能,其它功能如可以讓Bean產(chǎn)生或消費(fèi)事件,定義截取者跨所有Bean類型綁定額外的功能,或者定義裝飾者在指定Bean類型上應(yīng)用額外的功能。

原文:Introducing the Java EE 6 Platform 作者:Ed Ort


當(dāng)前題目:面向JavaEE6平臺(tái)的上下文和依賴性注入
網(wǎng)頁(yè)地址:http://www.5511xx.com/article/dhcepdo.html