我需要就以下问题寻求帮助。我正在从属性文件中读取一些属性,并将更改/最终值分配给另一个变量。我在将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());
}
答案 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中使用localFile
和remoteFile
个变量。
答案 1 :(得分:2)
您可以实现使用@PostConstruct
注释的方法(或实现InitializingBean
并实现afterPropertiesSet
)并在那里设置值。 Spring将在应用程序加载时在bean初始化之后调用此方法。
答案 2 :(得分:-1)
检查属性文件是否在类路径中,以及您的类是否注释为Spring组件