muy 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软件企业软件开发博客上, 配置 JEE合作伙伴 Markus Eisele的Java EE应用程序或“将Bien付诸实践” 。
相关文章 :
- 从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
muy bien