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?