我有一个基于Spring Framework的应用程序,它使用外部属性文件来处理数据库主机字符串,用户名和密码等内容,以便我们可以将配置文件检查到我们的存储库(它的开源)并且不会危及安全性数据库。它也很棒,因为开发人员可以保留自己的文件副本,应用程序将自动使用其系统上的配置,而不必手动重新配置。
我希望能够以相同的方式指定bean。我们正在处理一些可能从开发人员转变为开发人员的类,如果我们允许他们在不同的文件中指定这些信息,那么他们就不会乱用主配置文件。
为了给你一个想法,我们有类似的东西
<property name="url">
<value>${db.host}</value>
</property>
在另一个文件中指定db.host的位置。我们想要的是像
<bean name="ourBean" class="${class.weneed}" />
上述语法实际上并不起作用,但这证明了我们想要做的事情。
提前致谢!
克里斯
答案 0 :(得分:7)
您可以使用FactoryBean
。这个例子是FactoryBean
,它利用Spring在注入属性时将类名转换为Class
对象的能力:
public class MyFactoryBean extends AbstractFactoryBean {
private Class targetClass;
public void setTargetClass(Class targetClass) {
this.targetClass = targetClass;
}
@Override
protected Object createInstance() throws Exception {
return targetClass.newInstance();
}
@Override
public Class getObjectType() {
return targetClass;
}
}
然后:
<bean name="ourBean" class="com.xyz.MyFactoryBean">
<property name="targetClass" value="${class.weneed}"/>
</bean>
Spring上下文现在将有一个名为ourBean
的bean,它是${class.weneed}
类型的对象
答案 1 :(得分:0)
另一种选择可能是使用cocoon-spring-configurator,这是Cocoon框架的一部分,但可以单独使用,而不依赖于任何其他茧东西。
我们将这个用于很多webapps。一般的想法是基于runningMode配置bean工厂。
它允许您轻松替换/覆盖属性,但也可以覆盖完整的bean定义。
一个常见的用例是定义应用程序使用的bean,然后使用一些额外的配置文件(从不检查源代码控制),覆盖一些bean来模拟应用程序的某些部分。
答案 2 :(得分:0)
我发现通过反射创建的bean不是合适的spring bean(未在spring上下文中注册,也没有初始化属性),所以这里有一些小改进:
@Override
protected Object createInstance() throws Exception {
AutowireCapableBeabFactory beanFactory = (AutowireCapableBeabFactory ) getBeanFactory();
return beanFactory.createBean(this.targetClass);
}