静态块不适用于 Spring 中的 @Value

6 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());
    }
Run Code Online (Sandbox Code Playgroud)

Ger*_*Amy 10

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

编辑:(添加一个例子)

@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());
}
Run Code Online (Sandbox Code Playgroud)

因此,我有localFileremoteFile变量,准备在这个bean使用,初始化后。

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


小智 -2

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