java - 重新加载不包括某些 bean 的 spring bean

标签 java spring spring-environment

我希望能够定期检查某些属性文件并相应地在我的应用程序中应用更改。

在我的 java-spring 应用程序中,我定期检查从文件系统加载的属性文件是否已更改:

Resource propsResource = new FileSystemResource("/path/to/properties/file");
File propertiesFile = propsResource.getFile();
long currentTimeStamp = propertiesFile.lastModified();
if (currentTimeStamp != lastModified) {
//File Changed
}

如果它发生了变化,我想重新加载我的 spring bean,因为其中一些实际上已经加载了 conditionally中继属性文件中的属性值。

使用 refresh方法没有起到作用,所以我实际上是在调用 close方法并重新创建我的上下文:

context.close();
context = new AnnotationConfigApplicationContext(AppConfig.class);

这就是诀窍。我的问题是我有一些包含缓存数据的 bean,我不想丢失这些数据。 一种解决方案是继续使用此方法,但要确保我的缓存数据驻留在不受 spring 管理的类中(由我管理的静态或单例)。

另一种解决方案可能是在重新创建上下文之前复制我的缓存数据,然后将其设置回新创建的 bean(那些保存缓存数据的 bean),但这感觉非常难看。

有更好的方法吗?

最佳答案

我宁愿不要自己重新加载上下文文件,让 jvm 来处理它。

对于您遇到的问题,您可能需要查看 Jdk 1.7 及更高版本中提供的 Watcher 服务。它所做的是,它检查特定目录中的文件是否被修改,如果它被修改,你可以覆盖该方法来做你想做的事情。

Watcher service in jdk 1.7

关于java - 重新加载不包括某些 bean 的 spring bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31700328/

相关文章:

java - 可以控制 Java 中对象的身份吗?如果可以,如何控制?

mysql - 如何使用 Spring MVC 在 Hibernate 中进行连接查询

java - 使用 hibernate 从 DTO 更新实体会删除其他字段

spring - chalice 升级错误-创建名称为 'transactionManagerPostProcessor'的bean

java - Spring 5 从环境中获取对象列表

java - 将java程序保存为一个文件时遇到问题吗?

java - Firebase 响应 400

java - 将 <property-placeholder> 属性暴露给 Spring 环境

java - Android:如何从布局文件自动生成Java代码?

java - Spring 适用于多种环境的最佳方法