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

歡迎訪問 生活随笔!

生活随笔

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

java

Java EE6 CDI,命名组件和限定符

發布時間:2023/12/3 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java EE6 CDI,命名组件和限定符 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Java EE6的最大承諾之一就是簡化了依賴注入的使用。 他們做到了,使用CDI 。 CDI代表Java EE的上下文和依賴注入,它提供了一個基礎集,用于在企業應用程序中應用依賴注入。

在CDI之前,EJB 3還引入了依賴注入,但這有點基礎。 您可以將EJB(全狀態或無狀態)注入另一個EJB或Servlet(如果您的容器支持)。 當然,并不是每個應用程序都需要EJB的,這就是CDI如此受歡迎的原因。

首先,我已經舉了這個例子。 有一個Payment接口和2個實現。 現金付款和簽證付款。

我希望仍然可以使用相同的界面選擇我注入的女巫付款類型:

public interface Payment {void pay(BigDecimal amount); }

這是兩個實現:

public class CashPaymentImpl implements Payment {private static final Logger LOGGER = Logger.getLogger(CashPaymentImpl.class.toString());@Overridepublic void pay(BigDecimal amount) {LOGGER.log(Level.INFO, "payed {0} cash", amount.toString());} }public class VisaPaymentImpl implements Payment {private static final Logger LOGGER = Logger.getLogger(VisaPaymentImpl.class.toString());@Overridepublic void pay(BigDecimal amount) {LOGGER.log(Level.INFO, "payed {0} with visa", amount.toString());} }

要注入接口,我們使用@Inject批注。 注釋基本上按照它說的去做。 它注入一個組件,該組件在您的應用程序中可用。

@Inject private Payment payment;

當然,您看到的消息來自一英里遠,這是行不通的。 該容器具有我們的Payment接口的2個實現,因此他不知道要注入哪個。

類型[Payment]類型的依賴關系,在注入點[[field] @Inject private be.styledideas.blog.qualifier.web.PaymentBackingAction.payment]處帶有限定符[@Default]

因此,我們需要某種限定符來指出我們想要的實現。 CDI提供@Named批注,使您可以為實現命名。

@Named("cash") public class CashPaymentImpl implements Payment {private static final Logger LOGGER = Logger.getLogger(CashPaymentImpl.class.toString());@Overridepublic void pay(BigDecimal amount) {LOGGER.log(Level.INFO, "payed {0} cash", amount.toString());} }@Named("visa") public class VisaPaymentImpl implements Payment {private static final Logger LOGGER = Logger.getLogger(VisaPaymentImpl.class.toString());@Overridepublic void pay(BigDecimal amount) {LOGGER.log(Level.INFO, "payed {0} with visa", amount.toString());} }

現在,當我們更改注入代碼時,我們可以指定所需的實現。

@Inject private @Named("visa") Payment payment;

這行得通,但是靈活性受到限制。 當我們想重命名@Named參數時,我們必須在使用它的每個地方都對其進行更改。 也沒有重構支持。

有一個更好的選擇,可以使用@Qualifier注釋使用定制注釋。 讓我們稍微更改一下代碼。

首先,我們創建新的注釋類型。

@java.lang.annotation.Documented @java.lang.annotation.Retention(RetentionPolicy.RUNTIME) @javax.inject.Qualifier public @interface CashPayment { }@java.lang.annotation.Documented @java.lang.annotation.Retention(RetentionPolicy.RUNTIME) @javax.inject.Qualifier public @interface VisaPayment { }

添加到批注中的@Qualifier批注使此批注可由容器發現。 現在,我們可以簡單地將這些注釋添加到我們的實現中。

@CashPayment public class CashPaymentImpl implements Payment {private static final Logger LOGGER = Logger.getLogger(CashPaymentImpl.class.toString());@Overridepublic void pay(BigDecimal amount) {LOGGER.log(Level.INFO, "payed {0} cash", amount.toString());} }@VisaPayment public class VisaPaymentImpl implements Payment {private static final Logger LOGGER = Logger.getLogger(VisaPaymentImpl.class.toString());@Overridepublic void pay(BigDecimal amount) {LOGGER.log(Level.INFO, "payed {0} with visa", amount.toString());} }

現在我們唯一需要做的就是將我們的注入代碼更改為

@Inject private @VisaPayment Payment payment;

現在,當我們對限定符進行更改時,我們將獲得不錯的編譯器和重構支持。 這也為API或特定于域的語言設計增加了靈活性。

參考: Java EE6 CDI,來自Styled Ideas Blog的 JCG合作伙伴 Jelle Victoor的 命名組件和限定詞 。

相關文章 :
  • Java EE6裝飾器:在注入時裝飾類
  • Java EE6事件:JMS的輕量級替代品
  • Java EE中的配置管理
  • 基本的EJB參考,注入和查找
  • Java模塊化方法–模塊,模塊,模塊
  • Java EE過去,現在和云7
  • Java教程和Android教程列表

翻譯自: https://www.javacodegeeks.com/2011/10/java-ee6-cdi-named-components-and.html

總結

以上是生活随笔為你收集整理的Java EE6 CDI,命名组件和限定符的全部內容,希望文章能夠幫你解決所遇到的問題。

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