условные бобы с помощью весны - PullRequest
13 голосов
/ 29 июня 2010

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

public Validator getNewValidator(ValidatorType type){

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

}

Я хочу написать, используя определение bean-компонентов spring xml

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

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

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

определение бина.

Ответы [ 5 ]

22 голосов
/ 21 января 2011

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

<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 просто добавьте этот контекст в начало вашей весенней конфигурации

<context:property-placeholder location="classpath:app.properties" />
2 голосов
/ 30 июня 2010

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

1 голос
/ 26 октября 2012

У меня были немного другие требования. В моем случае я хотел зашифровать пароль в процессе производства, но обычный текст в процессе разработки. Кроме того, у меня не было доступа к родительскому компоненту parentEncoder. Вот как мне удалось этого добиться:

</p> <pre><code><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.

1 голос
/ 03 августа 2012

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

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

Больше информации на https://stackoverflow.com/a/7813228/418439

0 голосов
/ 08 февраля 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...