是否可以在外部文件中为Spring Framework指定类名?

时间:2010-02-05 17:20:22

标签: java spring

我有一个基于Spring Framework的应用程序,它使用外部属性文件来处理数据库主机字符串,用户名和密码等内容,以便我们可以将配置文件检查到我们的存储库(它的开源)并且不会危及安全性数据库。它也很棒,因为开发人员可以保留自己的文件副本,应用程序将自动使用其系统上的配置,而不必手动重新配置。

我希望能够以相同的方式指定bean。我们正在处理一些可能从开发人员转变为开发人员的类,如果我们允许他们在不同的文件中指定这些信息,那么他们就不会乱用主配置文件。

为了给你一个想法,我们有类似的东西

<property name="url">
  <value>${db.host}</value>
</property>

在另一个文件中指定db.host的位置。我们想要的是像

<bean name="ourBean" class="${class.weneed}" />

上述语法实际上并不起作用,但这证明了我们想要做的事情。

提前致谢!

克里斯

3 个答案:

答案 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);
}