我正在考虑使用Spring来组装我的应用程序的组件,但我遇到了一个问题。我们的应用程序使用一个配置存储库,该存储库对VM是全局的,并且与系统属性相似(但不完全相同)。
该配置接口的访问方式如下:
Configuration.getDb ().get ("some_property_name")
有没有办法在Spring xml bean文件中使用这个全局配置中的值?getDb
可能会根据配置库的当前状态(它具有上下文)返回不同的值,但我愿意声明,Spring配置将在应用程序上下文初始化时完全加载。尽管如此,更灵活的东西还是很棒的。
鉴于我是一名Spring新手,代码示例将使我的工作变得容易得多。
发布于 2009-04-17 14:51:25
为了进一步阐述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基本用法的参考文档,以了解它的工作原理。它非常灵活。
发布于 2009-04-13 04:59:51
您可以这样做,尽管这不是处理配置数据的推荐方法。请参阅Spring参考文档的3.7 Container extension points。
基本上,您需要创建一个自定义的BeanFactoryPostProcessor实现来替换如下表达式:
${some_property_name}
根据回调使用适当的值。
以PropertyPlaceholderConfigurer的实现为起点。
发布于 2009-04-30 19:59:13
您可以完全在配置中完成此操作(我并不是说这真的很好;):
<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 Spring3.0将包含一种适用于这种情况的表达式语言(请参阅blog post) :)。
https://stackoverflow.com/questions/743051
复制相似问题