Spring属性注入中的final属性@Value - Java

56

一个关于Spring注入属性文件的简单问题,针对final属性。

我有一个属性文件,我想要在里面存储文件路径。通常当我使用属性文件时,我会使用以下方式设置类属性:

private @Value("#{someProps['prop.field']}") String someAttrib ;

那么在我的spring.xml文件中,我将会有类似以下的内容:

<util:properties id="someProps"   
    location="classpath:/META-INF/properties/somePropFile.properties" />

这很好用,简单易懂,可以让代码整洁美观。但是我不确定在尝试将属性值注入最终类属性时最整洁的模式是什么?

显然像这样:

private static final @Value("#{fileProps['dict.english']}") String DICT_PATH; 

不会起作用。还有其他方法吗?


3
不,这两种方法不兼容。 - skaffman
2个回答

54

你唯一能够向一个final field中注入数值的方式是通过构造函数注入。其他方法都将是Spring方面可怕的黑客行为。


10
有没有这方面的例子? - wheeler

37

如果您正在寻找一个例子,这里有一个:

public class Test {
    private final String value;

    public Test(@Value("${some.value}") String value){
        this.value=value;
        System.out.println(this.value);
    }
}

你打算如何初始化这个类?你会将它注释为“Component”并让容器来完成,还是有其他的方式? - giannis christofakis
2
使用@Component注解或任何其他的模式都可以。 - Austin Poole
2
有没有想过如何在静态属性中实现相同的功能? - giannis christofakis
1
你不能这样做。你只能通过两种方式来初始化一个静态的final属性:在静态块中或在声明语句中。 static { STATIC_VARIABLE = "value";} 或者 private static final String FOO = "bar" - Austin Poole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接