php cdi_使用CDI的InjectionPoint注入配置值
php cdi
依賴注入是用于組織類依賴的一項出色技術。 當前類中需要的所有類實例都是在運行時從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; 結論 :在整個應用程序中訪問一組配置值從未如此簡單。
翻譯自: https://www.javacodegeeks.com/2014/02/injecting-configuration-values-using-cdis-injectionpoint.html
php cdi
總結
以上是生活随笔為你收集整理的php cdi_使用CDI的InjectionPoint注入配置值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mockito java_使用Mocki
- 下一篇: 电脑显示器出现小斑点(电脑显示器有红色斑