使用spring的条件bean

时间:2010-06-29 13:33:24

标签: java spring dependency-injection

我正在尝试写一个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定义。

5 个答案:

答案 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}")

更多信息位于https://stackoverflow.com/a/7813228/418439

答案 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.encodingsha

答案 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依赖。