配置Java EE应用程序或“将Bien付诸实践”
為什么發(fā)布這個(gè)帖子?
亞當(dāng)展示的基本知識(shí)非常聰明。 你只是
@Inject int yourConfigVariable;到此為止。 您不必關(guān)心屬性或其他配置類(lèi)。 但是查看它,您發(fā)現(xiàn)您需要以某種方式從某個(gè)地方填充您的配置。 回顧安東尼奧的帖子,您會(huì)發(fā)現(xiàn)您有很多選擇。 我們最滿(mǎn)意的一種可能是Java的Properties機(jī)制。 結(jié)合使用此代碼和Adam提供的代碼,您最終將獲得Configuration.properties,其中包含無(wú)數(shù)個(gè)單詞鍵列表。 那不是我所說(shuō)的可維護(hù)的。 因此,基本上,這就是該帖子為何擁有標(biāo)題的原因:“將Bien付諸實(shí)踐” ..oO(對(duì)不起,亞當(dāng)!):-)這是我解決該問(wèn)題的方法。
從屬性文件填充您的配置
最基本的部分是將Configuration.properties文件添加到您的應(yīng)用程序(默認(rèn)程序包)。 現(xiàn)在,我們將對(duì)配置持有人進(jìn)行一些修改,使其成為屬性類(lèi)型。 現(xiàn)在,修改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);}現(xiàn)在,您必須相應(yīng)地修改@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;}為了方便起見(jiàn),我將聲明類(lèi)的名稱(chēng)添加為propertyPath,以便使屬性文件中的順序更加明確。 如Adam所示,使用生產(chǎn)者方法:
package net.eisele.configuration; public class HitsFlushTimer {@Injectprivate String hitsFlushRate;}在這種情況下,您最終使用Configuration.properties文件中的鍵net.eisele.configuration.HitsFlushTimer.hitsFlushRate訪(fǎng)問(wèn)屬性。 快速警告。 如果您遇到這種情況,則必須在耳朵內(nèi)打包單獨(dú)的ejb和war模塊,您可能需要在Configuration單例中使用javax.annotation.security.PermitAll注釋。
然后您會(huì)得到很多重復(fù)
可能是真的。 如果重新配置相同的配置(例如,httpProxy),這將強(qiáng)制您為屬性文件中的不同鍵使用相同的值。 解決方案似乎很簡(jiǎn)單。 為此,我們需要自己的資格賽。 我們走吧:
@Retention(RUNTIME) @Target({FIELD, METHOD}) @Qualifier public @interface AppProperty {@Nonbindingpublic String value(); }現(xiàn)在我們有自己的資格賽。 接下來(lái)是相應(yīng)地更改@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; }而已。 現(xiàn)在,您可以在任何地方使用類(lèi)似的內(nèi)容:
@Inject@AppProperty("net.eisele.configuration.test2")String test2;我知道,這還不如亞當(dāng)?shù)?#64;Inject注解那么優(yōu)雅。 但是:您不必花很多時(shí)間就可以看到正在發(fā)生的事情以及您的價(jià)值來(lái)自何處。 我認(rèn)為這是一個(gè)有多個(gè)開(kāi)發(fā)人員的項(xiàng)目中的專(zhuān)業(yè)人士。
是的 仍然不是很可維護(hù)。
好。 我知道。 您仍在談?wù)撝貥?gòu)屬性名稱(chēng)。 對(duì)? 還剩下什么呢? 您可以考慮使用封裝了所有屬性鍵的CKey枚舉,并使用它而不是簡(jiǎn)單地使用鍵本身。 但是,我寧愿在代碼中簡(jiǎn)單地使用普通的String鍵。 現(xiàn)在配置愉快。 您如何配置應(yīng)用程序? 讓我知道! 很高興收到評(píng)論:)
參考: 配置Java EE應(yīng)用程序,或從JCG合作伙伴 Markus Eisele的“將Bien付諸實(shí)踐” (位于使用Java的企業(yè)軟件開(kāi)發(fā)中) 。
相關(guān)文章 :
- 從Spring到Java EE 6
- Java EE中的配置管理
- Java EE過(guò)去,現(xiàn)在和云7
- Java EE6事件:JMS的輕量級(jí)替代品
- Java EE6裝飾器:在注入時(shí)裝飾類(lèi)
翻譯自: https://www.javacodegeeks.com/2011/12/configure-java-ee-applications-or.html
總結(jié)
以上是生活随笔為你收集整理的配置Java EE应用程序或“将Bien付诸实践”的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 私人dns是什么意思 私人dns是什么
- 下一篇: Java SE 7、8、9 –推进Jav