Условный 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 в вашем коде.