static块在Spring中不能与@Value一起使用

时间:2015-11-19 21:05:19

标签: java spring spring-mvc

我需要就以下问题寻求帮助。我正在从属性文件中读取一些属性,并将更改/最终值分配给另一个变量。我在将static {}块更改为普通块或构造函数时遇到困难。

我希望所有这些变量在Web应用程序加载/部署时从.properties文件中获取值。有什么帮助吗?

private static String username;
private static String password;
private static String dbURL;
private static String dbPort;
private static String filePath;
private static File localFile;
private static File remoteFile;


@Value("${local.file.name}")
private String localFileName;

@Value("${remote.file.name"})
private String remoteFileName;

    static {
        File finalFilePath = new File(filePath);
        if (!finalFilePath.exists() && !finalFilePath.isDirectory()) {
            finalFilePath.mkdirs();
        }
        localFile = new File(StringBuffer(finalFilePath).append("/").append("localFileName").toString());
        remoteFile = new File(StringBuffer(finalFilePath).append("/").append("remoteFileName").toString());
    }

3 个答案:

答案 0 :(得分:3)

那永远不会奏效。 static块执行发生在spring生命周期之前。 Spring将在创建实例后注入这些属性值(@Value),因此,正如jny所说,您需要使用@PostConstructor(或任何其他选项spring提供初始化)而不是静态块初始化。 / p>

编辑:(添加示例)

@Value("${local.file.name}")
private String localFileName;

@Value("${remote.file.name"})
private String remoteFileName;


@PostConstruct 
public void setup() {
        File finalFilePath = new File(filePath); // assume filePath is already injected
        if (!finalFilePath.exists() && !finalFilePath.isDirectory()) {
            finalFilePath.mkdirs();
        }
        localFile = new File(StringBuffer(finalFilePath).append("/").append("localFileName").toString());
        remoteFile = new File(StringBuffer(finalFilePath).append("/").append("remoteFileName").toString());
}

因此,在初始化之后,我已准备好在此bean中使用localFileremoteFile个变量。

此处有更多示例:http://www.journaldev.com/2637/spring-bean-life-cycle-methods-initializingbean-disposablebean-postconstruct-predestroy-aware-interfaces

答案 1 :(得分:2)

您可以实现使用@PostConstruct注释的方法(或实现InitializingBean并实现afterPropertiesSet)并在那里设置值。 Spring将在应用程序加载时在bean初始化之后调用此方法。

答案 2 :(得分:-1)

检查属性文件是否在类路径中,以及您的类是否注释为Spring组件