Java 仅为选定变量重新加载/刷新Spring配置文件和刷新值

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

在spring应用程序中,我希望能够更改application.proporties的内容,并将这些更改传播到@Value注释的所有bean值

我知道我可以简单地重新加载所有Spring上下文,但我不想这样做。某些组件无法重新创建。我只想为选择的bean比例重新加载值

我正在使用Spring3.2

我的解决方案 我原型化了自己的解决方案,但它需要在一些Spring内部类上使用反射。我在寻找更清晰的解决方案

获取所需的内部Sping对象并公开我需要的方法/字段:

    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

我知道这很旧-但我在另一个帖子中发布了一个可行的解决方案:-希望这能有所帮助