Java 将依赖项值注入枚举

Java 将依赖项值注入枚举,java,dependency-injection,enums,spring-boot,Java,Dependency Injection,Enums,Spring Boot,我有以下枚举: public class Wrapper(){ public enum MyEnum{ A("a_id", "a_source", "a_target"), B("b_id", "b_source", "b_target"), ... Z("z_id", "z_source", "z_target"), String id; String source; St

我有以下枚举:

public class Wrapper(){
    public enum MyEnum{
        A("a_id", "a_source", "a_target"),
        B("b_id", "b_source", "b_target"),
        ...
        Z("z_id", "z_source", "z_target"),

        String id;
        String source;
        String target;
        myEnum(String i, String s, String t){
            id = i;
            source = s;
            target = t;
        }
    }    
}
如果可能,我希望能够在
application.properties
中指定枚举参数(例如
“a_id”
),以便根据需要修改和插入它们。我最初的想法是:

public class Wrapper(){
    @Value("${a.id}")
    private String A_ID;
    @Value("${a.source}")
    private String A_SOURCE;
    @Value("${a.target}")
    private String A_TARGET;

    public enum MyEnum{
        A(A_ID, A_SOURCE, A_TARGET),
        ...
    }    
}
使用
application.properties
看起来像:

a.id=a_id
a.source=a_source
a.target=a_target
问题是我不能在枚举内调用
A_ID
而不使其成为
static
,但是如果我使其成为
static
,我就不能执行依赖项注入(据我所知)


让这些字符串进行外部配置和注入的最佳方法是什么?

可能这家伙有答案:

正如dnault所说,尝试从
应用程序.properties
获取配置值在Spring中是不可能的-您需要保证Spring已经加载并解析了配置,然后尝试将其注入到静态对象中

但是,正如我链接的SO帖子所提到的,您需要为此使用Springs配置加载吗?我认为有人提到了另一种选择:

public enum MyEnum {
A;

public final String id;
public final String source;
public final String target;

MyEnum() {
    this.id = BUNDLE.getString("A.id");
    this.source = BUNDLE.getString("A.source");
    this.target = BUNDLE.getString("A.target");
}

private static final ResourceBundle BUNDLE = ResourceBundle.getBundle(...);
}

你不能这么做。但你可以:

public enum MyEnum {
     A, B, C, .... Z;

     String idKey() { return name().toLowerCase() + ".id"; }
     String sourceKey() { return name().toLowerCase() + ".source"; }
     String targetKey() { return name().toLowerCase() + ".target"; }

};
然后,您可以按照定义创建属性文件,然后在客户机代码中的某个位置创建:

MyEnum e = ...
properties.getProperty(e.idKey());