muy bien_配置Java EE应用程序或“将Bien付诸实践”

muy bien

过去,有关应用程序配置的讨论很多。 我不知道谁拉开了辩论的序幕,但是最基础的阅读(着眼于未来的Java EE 7及更高版本)是Antonio Goncalves的帖子[辩论] – Java EE 7中的配置又如何呢 ? 事实是,使用Vanilla Java EE,我们每天都在进行应用程序配置。 没有适当的机制。 看完昨天亚当的最新帖子后,我想对它做些补充,我认为它可以适合大多数项目。

为什么发布这个帖子?

亚当展示的基本知识非常聪明。 你只是

@Inject
int yourConfigVariable;

到此为止。 您不必关心属性或其他配置类。 但是查看它,您发现您需要以某种方式从某个地方填充您的配置。 回顾安东尼奥的帖子,您会发现您有很多选择。 我们最满意的一种可能是Java的Properties机制。 结合使用此代码和Adam提供的代码,您最终将获得Configuration.properties,其中包含无数个单词键列表。 那不是我所说的可维护的。 所以基本上,这就是为什么该帖子的标题是:“将Bien付诸实践” ..oO(对不起,亚当!):-)这是我解决该问题的方法。

从属性文件填充您的配置

最基本的部分是将Configuration.properties文件添加到您的应用程序(默认程序包)。 现在,我们将对配置持有人进行一些修改,使其成为属性类型。 现在,修改Adam的fetchConfiguration()方法以加载它。

private Properties configData;

@PostConstruct
    public 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 {
    @Inject
    private 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 {
    @Nonbinding
    public 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付诸实践”

相关文章 :


翻译自: https://www.javacodegeeks.com/2011/12/configure-java-ee-applications-or.html

muy bien

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值