假设我们在Spring中有这样一个组件:
@Component
public class MyComponent {
@Value("${someProperty}")
private String text;
}
如果我们定义属性占位符:
<context:property-placeholder location="classpath:myProps.properties"/>
和myPropos。properties包含someProperty的值,该值将在初始化上下文时注入text字段。这很简单,很容易。
但是假设我有一个服务允许用户改变someProperty:
的值public void changeProp(String name, String newValue);
是否有机会我可以重新注入newValue到文本字段。我的意思是,它应该非常直接……基本上它和初始化后注入没什么不同。我无法想象Spring不支持这个?我能取消什么活动吗?
我基本上可以自己做这个,但我在想是不是已经有东西了?如果没有,那么有谁知道Spring实际上是如何处理注入的呢?如果不存在解决方案,我可能会重用那里的代码来执行此操作。
我希望spring不支持这一点,因为正常的注入是在创建bean时完成的,而不是将它投入使用。
无论如何:在这篇博客文章"Spring 3.1, Java 7和Google Guava的可重载应用程序属性"中,你可以找到一个解决方案的想法。
关键思想是使用一个后处理器来构建一个包含所有属性字段的列表。如果属性改变了,可以使用这个列表来更新字段