这是关于在@Value注释中定制Spring的占位符解析的问题。
我们使用@Value初始化应用程序中的所有属性,通常来自servlet context init params,例如:
的web.xml
<context-param>
<param-name>app.some.param</param-name>
<param-value>SOME_VALUE</param-value>
</context-param>
类文件
@Value("${app.some.param:DEFAULT_VALUE}")
private String myParameter;
我们实际上没有使用web.xml,我们使用Tomcat上下文文件甚至指定使用vmargs。
我们要支持的是在运行时对这些属性进行动态更改。我想以某种方式收集@Value中使用的属性键列表,它还有一个像@Dynamic这样的新注释。对于标记为@Dynamic的属性,bean可以提供相应的setter,以便在修改属性时进行任何重新初始化。
我想创建一个支持按键更新属性的服务,例如:
void setProperty(String key, String value) {
// find all beans that have @Value and @Dynamic and set field or call setter
// NB - should support Spring type coercion, eg. string --> integer, boolean, list, etc.
}
我一直在寻找PlaceholderConfigurerSupport和BeanDefinitionVisitor的源代码。我似乎可以覆盖PlaceholderConfigurerSupport.doProcessProperties并创建一个自定义的BeanDefinitionVisitor,但是需要花费很多代码。我想知道是否有人曾经看过这个并找到了解决方案。
我应该注意到我们最终还想要做的事情。我们希望在后备存储中保留更改的属性,如果已经修改,则在启动时使用这些属性而不是配置。通过这种方式,我们拥有属性源的层次结构:代码中的默认值,上下文/属性文件,已修改的peristed配置。我们还想提供一个显示所有动态属性集的UI。你明白了。
由于