gpt4 book ai didi

java - 更新由 Spring 注入(inject)的属性文件以包含上次运行时间戳

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:53:03 24 4
gpt4 key购买 nike

我有一个应用程序,它使用由 Spring 加载的属性文件。然后将 Properties 实例注入(inject)到几个类中。问题是其中一些属性已更新——例如,我们有一个 lastRun 时间戳,我们想将其存储在这里。也许有更好的方法来存储这样的东西(欢迎提出建议),但我该如何更新属性文件?

<util:properties id="props" location="some.properties"/>

props.store(...) 方法需要写入或输出流(我假设所有这些都是未知的,因为 Spring 处理此加载)..?

是否有更好的方法,或者我应该只传递来自 Spring context.xml 的文件路径并将其发送到各种 bean 并以老式方式加载/存储属性文件?

最佳答案

PropertiesFactoryBean 没有位置属性的访问器,但您可以从 BeanDefinition 获取位置属性。

BeanDefinition def = ctx.getBeanFactory().getBeanDefinition("props");
String location = def.getPropertyValues().getPropertyValue("location").getValue();
File file = ctx.getResource(location).getFile();

编辑

包含一个示例类来执行此操作。您可以在 bean 定义文件中定义 bean 并在适当的地方注入(inject)。

/**
* Update Spring managed properties
*/
public class SpringPropertyUpdater implements ApplicationContextAware {

private ConfigurableApplicationContext ctx;
private static final String LOCATION_PROPERTY = "location";
private static final Log log = LogFactory.getLog(SpringPropertyUpdater.class);

/**
* Update managed properties with new value
*/
public void updateProperties(String name, Properties props, String comments) {
ConfigurableListableBeanFactory fb = ctx.getBeanFactory();
BeanDefinition bf = fb.getBeanDefinition(name);
String location = (String) bf.getPropertyValues().getPropertyValue(LOCATION_PROPERTY).getValue();
Resource res = ctx.getResource(location);
try {
File file = res.getFile();
props.store(new FileOutputStream(file), comments);
} catch (IOException e) {
log.error(e);
}
}

/**
* {@inheritDoc}
*/
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.ctx = (ConfigurableApplicationContext) applicationContext;

}
}

关于java - 更新由 Spring 注入(inject)的属性文件以包含上次运行时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9322436/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com