Java EE 7中的资源和依赖注入
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中的资源和依赖注入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: scala 异步调用_非阻塞异步Java
- 下一篇: java 构建者模式_Java方法中的参