我正在考虑使用Spring来组装我的应用程序的组件,但我遇到了问题。我们的应用程序使用VM的全局配置存储库,与系统属性类似(但不精确)。
可以这样访问此配置API:
Configuration.getDb ().get ("some_property_name")
有没有办法在Spring xml bean文件中使用此全局配置中的值? getDb
可能会返回一个不同的值,具体取决于配置库的当前状态(它有上下文),但我愿意在应用程序上下文初始化时发出Spring配置完全加载的声明。不过,更灵活的事情会非常棒。
鉴于我是一个Spring新手,代码示例会让我的生活变得更轻松。
答案 0 :(得分:3)
您可以执行此操作,但这不是处理配置数据的建议方法。请参阅Spring参考文档的3.7 Container extension points。
基本上,您需要创建一个自定义BeanFactoryPostProcessor实现,该实现将替换如下表达式:
${some_property_name}
使用基于回调的适当值。
以PropertyPlaceholderConfigurer的实现为出发点。
答案 1 :(得分:1)
为了扩展cletus的建议,我想说你想要一个PropertyPlaceholderConfigurer的自定义子类,并覆盖resolvePlaceholder()方法,它会调用你的Configuration.getDb()代码。如果无法解析该值,则委托回超类。
例如:
public class MyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
@Override
protected String resolvePlaceholder(String placeholder, Properties props) {
String value = Configuration.getDb().get(placeholder)
if (value == null) {
value = super.resolvePlaceholder(placeholder, props);
}
return value;
}
}
然后在您的应用程序上下文中定义一个MyPlaceholderConfigurer类型的bean,spring将自动查询您的类以解析占位符值。
如果Configuration.getDb()组件无法解析该值,则委派回超类允许spring将该值作为系统属性进行查找。或者,您可以将属性文件注入bean中,也可以检查它。
阅读有关PropertyPlaceholderConfigurer基本用法的参考文档,了解它的工作原理。它非常灵活。
答案 2 :(得分:0)
你完全可以在配置中这样做(我不是说这真的很漂亮;):
<bean id="database" class="com.acme.Configuration" factory-method="getDb" />
<bean class="com.acme.YourHost">
<property name="yourProperty">
<bean factory-bean="database" factory-method="get">
<constructor-arg value="some_property_name" />
</bean>
</property>
</bean>
Glad Spring 3.0将包含针对此类案例的表达式语言(请参阅blog post):)。