configuration - 使用 ".properties"文件的依赖注入(inject)

标签 configuration dependency-injection annotations java-ee-6 cdi

我正在使用 Java EE 6,需要从“.properties”文件加载配置。有没有推荐的方式(最佳实践)使用依赖注入(inject)从配置文件中加载值?我在 Spring 中找到了这个注解,但我还没有找到 Java EE 的“标准”注解。

这家伙从头开发了一个解决方案:

http://weblogs.java.net/blog/jjviana/archive/2010/05/18/applicaction-configuration-java-ee-6-using-cdi-simple-example

"I couldn't find a simple example of how to configure your application with CDI by reading configuration attributes from a file..."



但我想知道是否有更标准的方式来代替创建配置工厂......

最佳答案

配置注解

package com.ubiteck.cdi;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import javax.enterprise.util.Nonbinding;
import javax.inject.Qualifier;

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface InjectedConfiguration {
    /**
     * Bundle key
     * @return a valid bundle key or ""
     */
    @Nonbinding String key() default "";
    /**
     * Is it a mandatory property
     * @return true if mandator
     */
    @Nonbinding boolean mandatory() default false;
    /**
     * Default value if not provided
     * @return default value or ""
     */
    @Nonbinding String defaultValue() default "";
 }

配置工厂可能如下所示:

import java.text.MessageFormat;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;

public class ConfigurationInjectionManager {
    static final String INVALID_KEY="Invalid key '{0}'";
    static final String MANDATORY_PARAM_MISSING = "No definition found for a mandatory configuration parameter : '{0}'";
    private final String BUNDLE_FILE_NAME = "configuration";
    private final ResourceBundle bundle = ResourceBundle.getBundle(BUNDLE_FILE_NAME);

    @Produces
    @InjectedConfiguration
    public String injectConfiguration(InjectionPoint ip) throws IllegalStateException {
        InjectedConfiguration param = ip.getAnnotated().getAnnotation(InjectedConfiguration.class);
        if (param.key() == null || param.key().length() == 0) {
            return param.defaultValue();
        }
        String value;
        try {
            value = bundle.getString(param.key());
            if (value == null || value.trim().length() == 0) {
                if (param.mandatory())
                    throw new IllegalStateException(MessageFormat.format(MANDATORY_PARAM_MISSING, new Object[]{param.key()}));
                else
                    return param.defaultValue();
            }
            return value;            
        } catch (MissingResourceException e) {
            if (param.mandatory()) throw new IllegalStateException(MessageFormat.format(MANDATORY_PARAM_MISSING, new Object[]{param.key()}));
            return MessageFormat.format(INVALID_KEY, new Object[]{param.key()});
        }
    }

Tutorial with explanation and Arquillian test

关于configuration - 使用 ".properties"文件的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10165226/

相关文章:

java - 使用 WebApplicationContext 的最低配置

java - WSO2 ESB 无法更新配置

configuration - 在 Terraform 配置中获取环境变量?

mvvm - 如何使用构造函数依赖注入(inject)将模型从集合提供给他们的 ViewModel?

java - 如何将多个注释合并为一个注释?

Java - 定义和访问注释?

c# - asp.net core 中的配置键是否应该不区分大小写?

typescript - 自定义组件未显示在 Ionic v4 + Angular 6 中

design-patterns - DI 容器是服务定位器吗?

ios - 遍历从属性列表中读入的 NSDictionary 证明很麻烦