Java 静态块不适用于弹簧中的@Value
我需要在以下问题上寻求帮助。我正在从属性文件中读取一些属性,并将更改/最终值分配给其他变量。我在将静态{}块更改为普通块或在构造函数中遇到困难 我希望所有这些变量在web应用程序加载/部署时从.properties文件中获取赋值。有什么帮助吗Java 静态块不适用于弹簧中的@Value,java,spring,spring-mvc,Java,Spring,Spring Mvc,我需要在以下问题上寻求帮助。我正在从属性文件中读取一些属性,并将更改/最终值分配给其他变量。我在将静态{}块更改为普通块或在构造函数中遇到困难 我希望所有这些变量在web应用程序加载/部署时从.properties文件中获取赋值。有什么帮助吗 private static String username; private static String password; private static String dbURL; private static String dbPort; priva
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());
}
检查属性文件是否在类路径中,以及您的类是否被注释为Spring组件您可以实现用
@PostConstruct
注释的方法(或者实现初始化bean
和实现afterPropertiesSet
)并在那里设置值。Spring将在应用程序加载时bean初始化后调用此方法。这永远不会起作用。
静态
块执行发生在spring生命周期之前。创建实例后,Spring将注入这些属性值(@Value
),因此,正如jny所说,例如,您需要使用@PostConstructor(或Spring为初始化提供的任何其他选项),而不是静态块初始化
编辑:(添加一个示例)
因此,在初始化之后,我已经准备好在这个bean中使用localFile
和remoteFile
变量
这里有更多的例子:这些属性属于哪一类(spring托管bean?、组件、服务、存储库、配置)?这样行吗?(通过调试后构造注释方法中的某些语句进行测试)请不要使用StringBuffer,因为它在十多年前被StringBuilder取代。在这种情况下,使用
+
将更高效,更易于阅读。谢谢您的建议。你能提供同样的样品项目吗?谢谢,Sayali
@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());
}