日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java EE 7中的资源和依赖注入

發(fā)布時間:2023/12/3 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java EE 7中的资源和依赖注入 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.概述

上下文和依賴注入(CDI)是Java EE的一項功能,可幫助融合Java EE 6和更高版本中包含的平臺的Web層和事務層。 從技術角度來看,這意味著CDI提供了依賴項注入框架,并且還管理了依賴項的生命周期。

今天在本教程中,我們將介紹Java EE 7的CDI。

1.1上下文和依賴注入規(guī)范

如Oracle的Java EE 7網(wǎng)站上所述 ,Java EE 7使用CDI 1.1,在JSR 346中對此進行了概述。

正如CDI負責人Pete Muir在本博客中提到的, CDI 1.1帶來了許多重大更改,例如:

  • 全局啟用攔截器,全局啟用裝飾器,以及使用@Priority批注的替代方法
  • 對構造函數(shù)的@AroundConstruct生命周期回調的支持
  • EventMetadata允許檢查事件元數(shù)據(jù)
  • 允許將攔截器綁定到構造函數(shù)

如前所述,博客文章中還提到了其他重大更改,建議將它們全部復習。

2.比較依賴注入和資源注入

射出類型 可以直接注入JNDI資源 可以直接注入常規(guī)課程 解決依據(jù) 類型安全
資源注入 真正 資源名稱 沒有
依賴注入 真正 類型

2.1依賴注入

依賴注入使我們能夠將常規(guī)Java類轉換為托管對象,并將這些托管對象注入其他托管對象。 障礙是確保我們在正確的時間提供正確的管理對象。

在這里,我們有一個@Inject批注,它表示我們將提供(也稱為注入)此構造函數(shù)的依賴項:

@Injectpublic MaskingDataProcessor(MaskingData maskingData) {this.maskingData = maskingData;}

那么,這種依賴關系從何而來?

在此示例中,我們有兩個類: SSNDataMasker和BirthdayMasker ,它們都實現(xiàn)相同的接口。

SSNDataMasker注釋為默認值,因此,如果可用,將默認選擇:

@Default public class SSNMasker implements MaskingData {... }

BirthdayMasker被注釋為替代依賴項,因此,如果SSNDataMasker不可用,則會選擇它:

@Alternative public class BirthdayMasker implements MaskingData {... }

2.2資源注入

資源注入使我們能夠將JNDI名稱空間中可用的任何資源注入到容器管理的任何對象中。 例如,我們可以使用資源注入來注入連接器,數(shù)據(jù)源或JNDI名稱空間中可用的任何其他資源。

在下面的代碼中,我們將數(shù)據(jù)源對象注入到字段中,這種資源注入被適當?shù)胤Q為基于字段的注入:

public class MyClass {@Resource(name="java:comp/SomeDataSource")private DataSource myDataBase;... }

注入資源的另一種方法是基于方法的注入 。 在基于方法的注入中,所傳遞的參數(shù)與資源一起注入:

public class MyClass {private DataSource myDataBase;...@Resource(name="java:comp/SomeDataSource")public void setMyDataSource(DataSource dataSource) {myDataBase = dataSource;} }

3. EJB和CDI有什么區(qū)別?

正如Oracle網(wǎng)站上的這篇文章所述 ,CDI中的“ C”是EJB bean和CDI bean之間的主要區(qū)別。 EJB組件可能是有狀態(tài)的,但并不是固有的上下文關系。 當我們引用有狀態(tài)組件實例時,必須在客戶端之間顯式傳遞該實例,并由應用程序銷毀它。 CDI通過上下文生命周期管理改進了EJB組件模型 。 但是,有時候我們想彼此使用。

3.1何時使用EJB

只有通過添加@ Stateful,@ Stateless或@Singleton來使CDI bean成為EJB時,才有幾種有用的容器服務可用。

示例包括:

  • 當我們公開一個JAX-WS @WebService時 ,使其成為EJB使得我們不必列出它并將其映射為xml文件中的servlet。 @Stateless和@Singleton可以使用此功能。
  • 當我們通過@Path公開JAX-RS資源時。 當RESTful服務是EJB時,我們將獲得自動發(fā)現(xiàn),不需要將其添加到JAX-RS Application子類或其他地方。 @Stateless和@Singleton可以使用此功能。
  • 當我們并行工作時, @Asynchronous方法調用非常有用。 眾所周知,線程過多會降低性能。 @Asynchronous批注允許我們并行化使用容器的線程池執(zhí)行的操作。 @ Stateful,@ Stateless和@Singleton可以使用此功能。

3.2何時使用CDI

簡而言之,當我們受益于CDI時,就應該使用CDI。 當我們需要注入,事件,攔截器,修飾器,生命周期跟蹤以及CDI提供的其他功能時。

4。結論

為了快速測試我們回顧的有關CDI的概念,讓我們將Weld添加到Maven項目中:

<dependency><groupId>org.jboss.weld.se</groupId><artifactId>weld-se-core</artifactId><version>2.4.1.Final</version> </dependency>

假設我們已經(jīng)有要測試的代碼(例如博客文章中先前提到的代碼),我們只需要執(zhí)行Weld,例如:

public static void main(String[] args) {Weld weld = new Weld();WeldContainer container = weld.initialize();MaskingDataProcessor maskingDataProcessor = container.select(MaskingDataProcessor.class).get();container.shutdown();}

翻譯自: https://www.javacodegeeks.com/2018/10/resource-dependency-injection-java-ee-7.html

總結

以上是生活随笔為你收集整理的Java EE 7中的资源和依赖注入的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。