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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用CDI的InjectionPoint注入配置值

發布時間:2023/12/3 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用CDI的InjectionPoint注入配置值 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

依賴注入是用于組織類依賴的一項出色技術。 當前類中需要的所有類實例都是在運行時從DI容器提供的。 但是您的配置呢?

當然,您可以創建一個“ Configuration”類,并在需要它的任何地方注入該類,并從中獲取必要的值。 但是CDI允許您使用InjectionPoint概念更細粒度地做到這一點。

如果編寫@Produces方法,則可以讓您的CDI容器也注入一些有關當前代碼的信息,新創建/產生的值將注入到這些信息中。 可在此處找到可用方法的完整列表。 有趣的一點是,您可以查詢此類以獲取當前注入點具有的所有注釋:

Annotated annotated = injectionPoint.getAnnotated(); ConfigurationValue annotation = annotated.getAnnotation(ConfigurationValue.class);

如上面的示例代碼所示,我們可以引入一個簡單的@Qualifier批注,該批注標記所有需要特定配置值的注入點。 在此博客文章中,我們只想使用字符串作為配置值,但是整個概念當然也可以擴展到其他數據類型。 已經提到的@Qualifier批注如下所示:

@Target({ElementType.FIELD, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Qualifier public @interface ConfigurationValue {@Nonbinding ConfigurationKey key(); }public enum ConfigurationKey {DefaultDirectory, Version, BuildTimestamp, Producer }

注釋當然具有保留策略RUNTIME,因為CDI容器必須在應用程序運行時對其進行評估。 它可以用于字段和方法。 除此之外,我們還創建了一個鍵屬性,該屬性由枚舉ConfigurationKey支持。 在這里,我們可以介紹所需的所有配置值。 在我們的示例中,例如,這是默認目錄,程序版本等的配置值。 我們將此屬性標記為@Nonbinding,以防止CDI容器使用此屬性的值來選擇正確的生產者方法。 如果我們不使用@Nonbinding,則必須為枚舉的每個值編寫一個@Produces方法。 但是這里我們要用一種方法處理所有這些。

下面的代碼示例顯示了@Produces方法,用于使用@ConfigurationKey注釋的字符串:

@Produces @ConfigurationValue(key=ConfigurationKey.Producer) public String produceConfigurationValue(InjectionPoint injectionPoint) {Annotated annotated = injectionPoint.getAnnotated();ConfigurationValue annotation = annotated.getAnnotation(ConfigurationValue.class);if (annotation != null) {ConfigurationKey key = annotation.key();if (key != null) {switch (key) {case DefaultDirectory:return System.getProperty("user.dir");case Version:return JB5n.createInstance(Configuration.class).version();case BuildTimestamp:return JB5n.createInstance(Configuration.class).timestamp();}}}throw new IllegalStateException("No key for injection point: " + injectionPoint); }

@Produces方法獲取作為參數注入的InjectionPoint,以便我們可以檢查其值。 因為我們對注入點的注釋感興趣,所以我們看看當前注入點是否使用@ConfigurationValue進行注釋。 如果是這種情況,我們看看@ConfigurationValue的key屬性并確定我們返回哪個值。 而已。 當然,在更復雜的應用程序中,我們可以從某些文件或某種其他類型的數據存儲中加載配置。 但是概念保持不變。

現在,我們可以輕松地使用以下兩行代碼來讓CDI容器注入所需的配置值:

@Inject @ConfigurationValue(key = ConfigurationKey.DefaultDirectory)private String defaultDirectory;

結論 :在整個應用程序中訪問一組配置值從未如此簡單。

參考:在Martin's Developer World博客上, 使用我們的JCG合作伙伴 Martin Mois 使用CDI的InjectionPoint注入配置值 。

翻譯自: https://www.javacodegeeks.com/2014/02/injecting-configuration-values-using-cdis-injectionpoint.html

總結

以上是生活随笔為你收集整理的使用CDI的InjectionPoint注入配置值的全部內容,希望文章能夠幫你解決所遇到的問題。

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