成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面向Java EE 6平臺的上下文和依賴性注入

原創
開發 后端
Java EE 6中主要的三大新技術包括面向Java EE平臺的上下文和依賴性注入(CDI)。JSR 299是一種為Java EE組件提供強大服務的技術,它統一和簡化了EJB和JSF編程模型,允許企業Bean替換JSF應用程序中JSF托管的Bean。

【51CTO精選譯文】Java EE 6平臺的發布帶來了幾個新的技術亮點。在前幾周,我們介紹了Java EE平臺的主要目標以及Java EE 6的RESTful Web Services Java API (JAX-RS)特性,本文將介紹面向Java EE平臺的上下文和依賴性注入(CDI)。

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

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

通過它的服務,CDI使Web層也支持事務,這樣在Web應用程序中訪問事務資源就更容易了。例如,CDI使得構建一個用JPA提供的持久化訪問數據庫的Java EE Web應用程序就更容易了。

讓我們再看看使用CDI服務的Web應用程序的關鍵部分,處理用戶登錄和注銷的應用程序同時包括JSF和EJB組件。下面是一個顯示登錄提示JSF頁面中的輸入窗體代碼:

  1. <f:view> 
  2.        <h:form> 
  3.            <h:panelGrid columns="2" rendered="#{!login.loggedIn}"> 
  4.               <h:outputLabel for="username">Username:h:outputLabel> 
  5.               <h:inputText id="username" value="#{credentials.username}"/> 
  6.               <h:outputLabel for="password">Password:h:outputLabel> 
  7.               <h:inputText id="password" value="#{credentials.password}"/> 
  8.            h:panelGrid> 
  9.            <h:commandButton value="Login" action="#{login.login}" rendered="#{!login.loggedIn}"/> 
  10.            <h:commandButton value="Logout" action="#{login.logout}" rendered="#{login.loggedIn}"/> 
  11.        h:form> 
  12.    f:view> 
  13.  

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

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

使用javax.annotation.ManagedBean注解或CDI注解,如范圍注解或限定注解,注解它的類來聲明一個托管Bean,后面將會介紹范圍注解和限定注解。基于注解的編程模型使得一個Bean開始是一個POJO,然后又轉換成另一種Java EE組件,如EJB組件成為可能,也許要使用更高級的功能,如事務和安全注解,或由EJB容器提供的實例,例如,你可以向對象添加一個@Stateful注解將一個POJO轉換成一個狀態會話,使用CDI的客戶端訪問Bean不受影響,因為POJO已經轉換成EJB了。

這里列舉的應用程序中,一個名叫Credentials的Bean有一個綁定到JSF請求的生命周期,Credentials Bean是象下面這樣實現的一個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.  

為了請求一個CDI服務,可以使用CDI注解注解一個Java EE組件,@Model注解是一個CDI注解,它將Credentials Bean作為模型-視圖-控制器(MVC)架構中的模型對象,內置于CDI中的注解是一種固定模式的注解,固定模式注解將類標記為滿足應用程序內的特定角色。

應用程序還包括一個Login Bean,它的生命周末是和HTTP會話綁定到一起的,Login Bean是作為一個EJB狀態會話Bean實現的,代碼如下:

  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注解是一個EJB注解,它指定這個Bean是一個EJB狀態會話Bean,@TransactionAttribute 和@RolesAllowed也是EJB注解,它們聲明EJB事務劃分和注解方法的安全屬性。

@SessionScoped注解是一個CDI注解,它給Bean指定一個范圍,所有的Bean都有一個范圍確定其實例的生命周期和這個實例對其它Bean的實例是否可見,這是一個很重要的特性,因為EJB組件沒有定義良好的范圍,尤其是EJB組件不能感知請求,會話和應用程序Web層組件,如JSF托管Bean的上下文,也不能訪問與這些上下文關聯的狀態。此外,狀態EJB組件的生命周期不能作用到Web層上下文。

相比之下,CDI中的作用域對象有一個定義良好的由Java EE容器托管的生命周期上下文,作用域對象可能是按需自動創建的,當上下文創建完畢后又自動銷毀的,值得注意的是,作用域狀態在相同上下文中執行的客戶端之間是自動共享的,這意味著客戶端,如其它在相同上下文中執行的Beans,會被當作相同的對象實例看待,但在不同上下文中的客戶端看到的是不同的實例。@SessionScoped注解指定Login Bean的作用域類型是會話作用域。對象通常不會與作用域關聯,一般依賴于它們的所有者,這些依賴對象的生命周期是和它們的所有者聯系在一起的,一個依賴對象當它的所有者被銷毀后它也自動銷毀。

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

@Produces注解將getCurrentUser()方法認為是一個生產者方法,每當系統中的另一個Bean需要指定類型的注入對象時就會調用生產者方法,在這個例子中,注入對象是當前登錄的用戶,它是通過限定注解@LoggedIn注入的,為了使用限定注解,你首先需要將它的類型定義為一個限定器,再使用@Qualifier注解,如:

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

#T#讓我們再回到前面討論的登錄提示,當用戶響應提示并點擊了提交按鈕后,CDI技術開始付諸行動,Java EE容器(51CTO編輯推薦:Java EE容器調查:Tomcat大受歡迎 WebLogic成時間殺手)自動實例化Credentials Bean和Login bean的一個上下文實例,一個綁定上下文的Bean的實例叫做上下文實例,JSF指定輸入給Credentials Bean上下文實例的用戶名和密碼,接下來JSF調用Login上下文實例中的login()方法。這個實例對于相同HTTP會話中的其它請求繼續存在并可繼續使用,并為其它請求它的Bean提供表示當前用戶的User對象。

這個例子只說明了這個技術的一部分功能,其它功能如可以讓Bean產生或消費事件,定義截取者跨所有Bean類型綁定額外的功能,或者定義裝飾者在指定Bean類型上應用額外的功能。

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

責任編輯:yangsai 來源: 51CTO.com
相關推薦

2017-05-11 14:00:02

Flask請求上下文應用上下文

2012-07-30 16:29:40

架構架構模式.NET

2009-07-28 15:03:02

依賴性注入

2009-12-22 09:57:36

Java EE 6RESTfulJAX-RS

2012-08-10 13:32:08

.NETAOP架構

2012-12-31 10:01:34

SELinuxSELinux安全

2023-05-04 12:55:04

用戶界面對象線程

2022-09-14 13:13:51

JavaScript上下文

2021-09-07 09:53:42

JavaScript變量提升

2021-06-09 08:32:15

開源Google安全工具

2009-09-17 11:19:34

OSGi依賴性管理

2023-07-11 10:02:23

2022-09-15 08:01:14

繼承基礎設施基礎服務

2025-04-07 01:02:00

GoAPI語言

2022-04-24 15:37:26

LinuxCPU

2024-03-14 08:11:45

模型RoPELlama

2019-03-14 08:00:00

JavaScript執行棧前端

2022-10-28 16:24:33

Context上下文鴻蒙

2024-09-30 14:10:00

2017-12-17 17:01:23

限界上下文系統模型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产传媒视频在线观看 | 一区二区三区四区不卡 | 夜夜骑综合| 一级在线观看 | 日韩精品免费视频 | 中文字幕在线观看视频网站 | 久久成人免费 | 久久久高清 | 日韩色视频 | 国产区视频在线观看 | 99re热这里只有精品视频 | 久久久蜜桃 | 久久亚洲视频网 | 亚洲成人国产综合 | 中文字幕乱码一区二区三区 | 日韩欧美中文字幕在线观看 | 黄色成人在线观看 | 国产精品久久a | 51ⅴ精品国产91久久久久久 | 久久免费资源 | 久久99精品久久久久久 | 中文字幕在线免费观看 | 五月天婷婷综合 | 亚洲国产aⅴ精品一区二区 免费观看av | 国产一二区视频 | 日日操日日干 | 亚洲人成网站777色婷婷 | 久久久久国产一区二区三区四区 | 欧美中文字幕在线 | 九九久久久 | 我爱操| 国产欧美精品在线 | 成人综合一区二区 | 蜜桃av一区二区三区 | 亚洲一区二区三区国产 | 国产xxxx岁13xxxxhd| 亚洲 一区 | 欧美国产日韩一区 | 国产真实乱全部视频 | 亚洲成人国产 | 亚洲一区中文字幕在线观看 |