Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to specify a class name for Spring Framework in an external file?

Tags:

java

spring

I have an application built on the Spring Framework that uses an external properties file for some things like database host string, username and password so that we can check the configuration file into our repository (it's open source) and not compromise the security of the db. It also is great because developers can keep their own copy of this file and the application will automatically use the configuration on their system rather than having to reconfigure manually.

I would like to be able to specify a bean in the same manner. We're working with some classes that could change from developer to developer and it would be great if we could allow them to specify this information in a different file so they don't have to mess with the main configuration file.

To give you an idea, we have something like

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

Where db.host is specified in another file. What we want is something like

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

The above syntax doesn't actually work, but that demonstrates what we want to do.

Thanks in advance!

Chris

like image 310
Chris Thompson Avatar asked Feb 05 '10 17:02

Chris Thompson


1 Answers

You can use a FactoryBean for this. This example is a FactoryBean which takes advantage of the ability of Spring to cast a classname to a Class object when injecting properties:

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;
    }

}

And then:

<bean name="ourBean" class="com.xyz.MyFactoryBean">
   <property name="targetClass" value="${class.weneed}"/>
</bean>

The Spring context will now have a bean called ourBean which is an object of type ${class.weneed}

like image 82
skaffman Avatar answered Oct 16 '22 14:10

skaffman