Условный beans с помощью spring

Я пытаюсь написать ValidatorFactory, который даст мне валидатор, основанный на его типе

public Validator getNewValidator(ValidatorType type){

    switch:
         case a : new Validator1();
         break;
          case b : new Validator2();
        break;

}

Я хочу написать с помощью определения spring xml beans

Я могу использовать метод инъекции, но он позволит мне создать только один объект и метод

не принимать никаких аргументов.

Я не хочу использовать FactoryBean. Я просто смотрю, можем ли мы это сделать, используя spring xml

bean.

Ответ 1

вы можете сделать условную bean инъекцию с простым xml. Атрибут "ref" может быть вызван значениями свойств из файла свойств и, таким образом, создать условный beans в зависимости от значений свойств. Эта функция не документирована, но она отлично работает.

<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" />

Ответ 2

Для сложных случаев (более сложных, чем разоблаченные) Spring JavaConfig может быть вашим другом.

Ответ 3

Если вы используете аннотацию (@Autowired, @Qualifier и т.д.) вместо xml, вы не можете заставить условную beans работать (по крайней мере, в текущей версии 3). Это связано с тем, что @Qualifier выполняет не выражение поддержки

@Qualifier(value="${validatorType}")

Дополнительная информация находится на fooobar.com/questions/257948/...

Ответ 4

У меня были несколько разные требования. В моем случае я хотел иметь закодированный пароль в производстве, но простой текст в разработке. Кроме того, у меня не было доступа к родительскому 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>

код >

Конечно, я определил password.encoding в файле свойств с возможными значениями как sha или plainText.

Ответ 5

Вы должны иметь возможность сделать это:

<bean id="myValidator" factory-bean="validatorFactory" factory-method="getNewValidator" scope="prototype">
    <constructor-arg><ref bean="validatorType"/></constructor-arg>
</bean>

<bean id="validatorType" ... />

Конечно, он использует автоматически настроенный FactoryBean снизу, но вы избегаете зависимости Spring в вашем коде.