我正在尝试写一个ValidatorFactory
,它会根据其类型
public Validator getNewValidator(ValidatorType type){
switch:
case a : new Validator1();
break;
case b : new Validator2();
break;
}
我想用spring xml beans definition定义
我可以使用方法注入,但它只允许我创建一个对象,而方法可以
不接受任何争论。
我不想使用FactoryBean
..我只是想看看我们是否可以使用spring xml
bean定义。
答案 0 :(得分:22)
你可以使用普通的xml进行条件bean注入。 “ref”属性可以由属性文件中的属性值触发,从而根据属性值创建条件bean。此功能未记录在案,但效果很好。
<bean id="validatorFactory" class="ValidatorFactory">
<property name="validator" ref="${validatorType}" />
</bean>
<bean id="validatorTypeOne" class="Validator1" lazy-init="true" />
<bean id="validatorTypeTwo" class="Validator2" lazy-init="true" />
属性文件的内容为:
validatorType = validatorTypeOne
要在xml中使用属性文件,只需将此上下文添加到spring config的顶部
<context:property-placeholder location="classpath:app.properties" />
答案 1 :(得分:2)
对于复杂的情况(比暴露的情况更复杂),Spring JavaConfig可能是你的朋友。
答案 2 :(得分:1)
如果您使用注释(@Autowired
,@Qualifier
等)而不是xml,则无法使条件bean工作(至少在当前版本3中)。这是由于@Qualifier 不支持表达式
@Qualifier(value="${validatorType}")
答案 3 :(得分:1)
我的要求略有不同。在我的情况下,我想在生产中编码密码,但在开发中使用纯文本。此外,我无权访问父bean parentEncoder
。这就是我设法实现这一目标的方法:
<bean id="plainTextPassword" class="org.springframework.security.authentication.encoding.PlaintextPasswordEncoder"/>
<bean id="shaPassword" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder">
<constructor-arg type="int" value="256"/>
</bean>
<bean id="parentEncoder" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="targetSource">
<bean class="org.springframework.aop.target.HotSwappableTargetSource">
<constructor-arg ref="${password.encoding}Password"/>
</bean>
</property>
</bean>
<bean id="plainTextPassword" class="org.springframework.security.authentication.encoding.PlaintextPasswordEncoder"/>
<bean id="shaPassword" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder">
<constructor-arg type="int" value="256"/>
</bean>
<bean id="parentEncoder" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="targetSource">
<bean class="org.springframework.aop.target.HotSwappableTargetSource">
<constructor-arg ref="${password.encoding}Password"/>
</bean>
</property>
</bean>
当然,我在属性文件中定义了,其可能的值为
password.encoding
或sha
。
答案 4 :(得分:0)
你应该可以这样做:
<bean id="myValidator" factory-bean="validatorFactory" factory-method="getNewValidator" scope="prototype">
<constructor-arg><ref bean="validatorType"/></constructor-arg>
</bean>
<bean id="validatorType" ... />
当然,它使用了一个自动配置的FactoryBean
,但你可以避免代码中的任何Spring依赖。