Java 仅为选定变量重新加载/刷新Spring配置文件和刷新值
在spring应用程序中,我希望能够更改application.proporties的内容,并将这些更改传播到@Value注释的所有bean值 我知道我可以简单地重新加载所有Spring上下文,但我不想这样做。某些组件无法重新创建。我只想为选择的bean比例重新加载值 我正在使用Spring3.2 我的解决方案 我原型化了自己的解决方案,但它需要在一些Spring内部类上使用反射。我在寻找更清晰的解决方案 获取所需的内部Sping对象并公开我需要的方法/字段:Java 仅为选定变量重新加载/刷新Spring配置文件和刷新值,java,spring,configuration,app-config,spring-3,Java,Spring,Configuration,App Config,Spring 3,在spring应用程序中,我希望能够更改application.proporties的内容,并将这些更改传播到@Value注释的所有bean值 我知道我可以简单地重新加载所有Spring上下文,但我不想这样做。某些组件无法重新创建。我只想为选择的bean比例重新加载值 我正在使用Spring3.2 我的解决方案 我原型化了自己的解决方案,但它需要在一些Spring内部类上使用反射。我在寻找更清晰的解决方案 获取所需的内部Sping对象并公开我需要的方法/字段: TypeConverter
TypeConverter typeConverter = beanFactory.getTypeConverter();
// get object which store autowiring metadata for beans
Object annotationProcessor = beanFactory
.getSingleton("org.springframework.context.annotation.internalAutowiredAnnotationProcessor");
// let it be public for my usage
Method findMethod = ReflectionUtils.findMethod(AutowiredAnnotationBeanPostProcessor.class ,"findAutowiringMetadata", Class.class);
ReflectionUtils.makeAccessible(findMethod);
// let it be public for my usage
Field checkedElements = ReflectionUtils.findField(InjectionMetadata.class, "checkedElements");
ReflectionUtils.makeAccessible(checkedElements);
迭代所有bean并使用我自己的注释(@Reloadable)搜索元素。然后为它们重新加载值
for (String name : allBeanNames) {
Object bean = beanFactory.getSingleton(name);
InjectionMetadata metadata = (InjectionMetadata) findMethod.invoke(
annotationProcessor, bean.getClass());
@SuppressWarnings("unchecked")
Set<InjectedElement> elements = (Set<InjectedElement>) checkedElements
.get(metadata);
for (InjectedElement element : elements) {
Member member = element.getMember();
// check for each elements if it has my own annotation which
// means that it should be realoaded
// check removed for simplify
// get new value and load it
String placeholder = valueAnnotation.value();
String resolvedValue = env.resolvePlaceholders(placeholder);
Object converted = typeConverter.convertIfNecessary(
resolvedValue, type, field);
// load value
if (member instanceof Method) {
((Method) member).invoke(bean, converted);
} else if (member instanceof Field) {
((Field) member).set(bean, converted);
}
}
}
for(字符串名称:allBeanNames){
对象bean=beanFactory.getSingleton(名称);
InjectionMetadata元数据=(InjectionMetadata)findMethod.invoke(
annotationProcessor,bean.getClass());
@抑制警告(“未选中”)
集合元素=(集合)选中元素
.get(元数据);
for(InjectedElement元素:元素){
Member=element.getMember();
//检查每个元素是否有我自己的注释
//意味着应该重新加载它
//为简化,请删除复选框
//获取新值并加载它
字符串占位符=valueAnnotation.value();
字符串resolvedValue=env.resolvePlaceholders(占位符);
已转换对象=类型转换器。ConvertifRequired(
解析值、类型、字段);
//负荷值
if(方法的成员实例){
((方法)成员).invoke(bean,已转换);
}else if(成员实例字段){
((字段)成员).set(bean,已转换);
}
}
}
其他解决方案
-适用于较旧版本的spring我知道这很旧-但我在另一个帖子中发布了一个可行的解决方案:-希望这能有所帮助