Spring自动装配使用注释和属性文件中定义的类型?

我的目标是一个框架,可以通过属性文件轻松更改具体类型的bean。 我也喜欢对XML进行注释。 理想情况下,我会像这样使用@Resource和SpEL的组合:

@Resource(type="#{myProperties['enabled.subtype']}")
SomeInterface foo;

我从一个文件中加载了myProperties和一个PropertiesFactoryBean<util:properties> ,其中包括:

enabled.type = com.mycompany.SomeClassA; // which implements SomeInterface

这不起作用,因为type的参数必须是文字,即不允许SpEL。 这里最好的做法是什么?

更新:请参阅下面的答案。


这正是Spring Java配置的用例。

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-java

或者你也可以制造工厂。

使用:org.springframework.beans.factory.FactoryBean <SomeInterface>

实现FactoryBean的bean的名称将被视为“SomeInterface”,即使它不是。


我认为这是不可能的,我倾向于采用的解决方案是使用工厂根据配置属性创建不同的对象(在您的示例中为enabled.type)。

第二种选择可能是按名称使用注入:

@Resource(name="beanName")

最后,如果你使用Spring 3.1+,你可以尝试使用配置文件,并在不同配置文件中使用不同的bean集合,如果这能解决你的问题。


Spring的Java配置和Bean定义配置文件结果正是我所期待的(谢谢@ Adam-Gent和@Guido-Garcia)。 前者对于动态因素似乎是必要的,而后者则促进了更好的实践。

这是一个使用Java配置和属性的解决方案:

@Configuration
public class SomeClassConfig {
    @Value("#{myProperties['enabled.subtype']}")
    public Class enabledClass;

    @Bean SomeInterface someBean() 
              throws InstantiationException, IllegalAccessException {
       return (SomeInterface) enabledClass.newInstance();
    }   
}

这是一个稍微不太动态的配置文件解决方案。

@Configuration
@Profile("dev")
public class DevelopmentConfig {
    @Bean SomeInterface someBean() {
       return new DevSubtype();
    }   
}

@Configuration
@Profile("prod")
public class ProductionConfig {
    @Bean SomeInterface someBean() {
       return new ProdSubtype();
    }   
}

通过配置文件,可以使用各种方法之一声明活动配置文件,例如通过系统属性,JVM属性,web.xml等。例如,使用JVM属性:

-Dspring.profiles.active="dev"
链接地址: http://www.djcxy.com/p/10769.html

上一篇: Spring autowire using annotations and a type defined in a properties file?

下一篇: Hibernate checking all elements equal in collection