配置Java EE应用程序或“将Bien付诸实践”
為什么發布這個帖子?
亞當展示的基本知識非常聰明。 你只是
@Inject int yourConfigVariable;到此為止。 您不必關心屬性或其他配置類。 但是查看它,您發現您需要以某種方式從某個地方填充您的配置。 回顧安東尼奧的帖子,您會發現您有很多選擇。 我們最滿意的一種可能是Java的Properties機制。 結合使用此代碼和Adam提供的代碼,您最終將獲得Configuration.properties,其中包含無數個單詞鍵列表。 那不是我所說的可維護的。 因此,基本上,這就是該帖子為何擁有標題的原因:“將Bien付諸實踐” ..oO(對不起,亞當!):-)這是我解決該問題的方法。
從屬性文件填充您的配置
最基本的部分是將Configuration.properties文件添加到您的應用程序(默認程序包)。 現在,我們將對配置持有人進行一些修改,使其成為屬性類型。 現在,修改Adam的fetchConfiguration()方法以加載它。
private Properties configData;@PostConstructpublic void fetchConfiguration() {String fileName = "Configuration.properties";configData =loadPropertiesFromClasspath(fileName); }/*** Load properties file from classpath with Java 7 :-)* @param fileName* @return properties*/public static Properties loadPropertiesFromClasspath(String fileName) {try (InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName)) {if (in != null) {props = new Properties();props.load(in);}} catch (IOException ioe) {log.debug("Can't load properties.", ioe);}現在,您必須相應地修改@Producer方法。 我只在這里顯示getString()方法向您展示概念:
/*** Get a String property* @param point* @return String*/ @Produces public String getString(InjectionPoint point) {String propertyPath = point.getMember().getDeclaringClass().getName()+ ".";String propertyName = point.getMember().getName();String propertyValue = configData.getProperty(propertyPath+propertyName);return (propertyValue == null) ? "" : propertyValue;}為了方便起見,我將聲明類的名稱添加為propertyPath,以便使屬性文件中的順序更加明確。 如Adam所示,使用生產者方法:
package net.eisele.configuration; public class HitsFlushTimer {@Injectprivate String hitsFlushRate;}在這種情況下,您最終使用Configuration.properties文件中的鍵net.eisele.configuration.HitsFlushTimer.hitsFlushRate訪問屬性。 快速警告。 如果您遇到這種情況,則必須在耳朵內打包單獨的ejb和war模塊,您可能需要在Configuration單例中使用javax.annotation.security.PermitAll注釋。
然后您會得到很多重復
可能是真的。 如果重新配置相同的配置(例如,httpProxy),這將強制您為屬性文件中的不同鍵使用相同的值。 解決方案似乎很簡單。 為此,我們需要自己的資格賽。 我們走吧:
@Retention(RUNTIME) @Target({FIELD, METHOD}) @Qualifier public @interface AppProperty {@Nonbindingpublic String value(); }現在我們有自己的資格賽。 接下來是相應地更改@Producer:
@Produces @AppProperty("")public String getString(InjectionPoint point) {String property = point.getAnnotated().getAnnotation(AppProperty.class).value();String valueForFieldName = configData.getProperty(property);return (valueForFieldName == null) ? "" : valueForFieldName; }而已。 現在,您可以在任何地方使用類似的內容:
@Inject@AppProperty("net.eisele.configuration.test2")String test2;我知道,這還不如亞當的@Inject注解那么優雅。 但是:您不必花很多時間就可以看到正在發生的事情以及您的價值來自何處。 我認為這是一個有多個開發人員的項目中的專業人士。
是的 仍然不是很可維護。
好。 我知道。 您仍在談論重構屬性名稱。 對? 還剩下什么呢? 您可以考慮使用封裝了所有屬性鍵的CKey枚舉,并使用它而不是簡單地使用鍵本身。 但是,我寧愿在代碼中簡單地使用普通的String鍵。 現在配置愉快。 您如何配置應用程序? 讓我知道! 很高興收到評論:)
參考: 配置Java EE應用程序,或從JCG合作伙伴 Markus Eisele的“將Bien付諸實踐” (位于使用Java的企業軟件開發中) 。
相關文章 :
- 從Spring到Java EE 6
- Java EE中的配置管理
- Java EE過去,現在和云7
- Java EE6事件:JMS的輕量級替代品
- Java EE6裝飾器:在注入時裝飾類
翻譯自: https://www.javacodegeeks.com/2011/12/configure-java-ee-applications-or.html
總結
以上是生活随笔為你收集整理的配置Java EE应用程序或“将Bien付诸实践”的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 私人dns是什么意思 私人dns是什么
- 下一篇: 安卓手机k歌怎么样才能媲美苹果(安卓手机