基于属性的值自动装配Spring bean

时间:2014-09-11 19:31:02

标签: spring properties dependency-injection

我正在使用Spring 3.2开发一个Spring MVC Web应用程序。我们将Web应用程序部署到不同的客户。每个客户可以使用服务接口的几种实现之一。

客户可能需要重置这些值,因此我们不能仅仅将实现硬连接到应用程序中,而是需要在外部进行配置。 我们已经在使用客户特定的属性文件来设置简单的属性,如字符串,数字等,但我问的是如何设置接口的特定实现。

,例如,

class MyClass {
 // this is straightforward
 @Value("${customer.propertyInPropertyFile}")
 private String customerSpecificString;

 // how to set the correct implementation for each customer?
 private ISomeService service;

}

如果ISomeService有4个实现,我们就不能自动装配或显式设置bean,因为这将在编译的代码中设置 - 并且在部署应用程序之后需要配置它(它可以是可以的如果需要,重新启动应用程序).​​.

有谁知道怎么做?使用Spring EL或配置文件会更好吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

因此,由于我想使用Java配置,我使用了以下解决方案:

@Configuration
@Profile("prod")
@EnableAsync
public class ProductionConfig extends BaseConfig
// inject property value which identifies theimplementation to use
Value("${service.impl}")
private String serviceName;

@Bean()

    public IRepository repository() {
        IRepository rc = null;
        if(StringUtils.isEmpty(serviceName)){
            rc =  new Impl1();
        } else if ("sword-mets".equals(serviceName)){
            rc = new Impl2();
        } else {
            rc = new Impl3();
        }
        log.info("Setting in repository implementation " + rc);
        return rc;

    }

所以,这不像使用别名的建议回复一样干净 - Config类需要知道所有可能的实现类 - 但是很简单,并且避免必须仅为此bean使用XML配置。