[英]conditional beans using spring
我正在嘗試編寫一個ValidatorFactory
,它將根據其類型為我提供驗證器
public Validator getNewValidator(ValidatorType type){
switch:
case a : new Validator1();
break;
case b : new Validator2();
break;
}
我想用spring xml bean定義來編寫
我可以使用方法注入,但它只允許我創建一個對象,而方法可以
不接受任何爭論。
我不想使用FactoryBean
..我只是想看看我們是否可以使用spring xml來做到這一點
bean的定義。
你可以使用普通的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配置的頂部即可
<context:property-placeholder location="classpath:app.properties" />
對於復雜的情況(比暴露的情況更復雜), Spring JavaConfig可能是你的朋友。
如果您使用注釋(@ @Autowired
,@ @Qualifier
等)而不是xml,則無法使條件bean工作(至少在當前版本3中)。 這是由於@Qualifier 不支持表達
@Qualifier(value="${validatorType}")
我的要求略有不同。 在我的情況下,我想在生產中編碼密碼,但在開發中使用純文本。 此外,我沒有訪問父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
。
你應該能夠做到這一點:
<bean id="myValidator" factory-bean="validatorFactory" factory-method="getNewValidator" scope="prototype">
<constructor-arg><ref bean="validatorType"/></constructor-arg>
</bean>
<bean id="validatorType" ... />
當然,它在下面使用自動配置的FactoryBean
,但您可以避免代碼中的任何Spring依賴項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.