簡體   English   中英

使用spring的條件bean

[英]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}")

有關更多信息, 訪問https://stackoverflow.com/a/7813228/418439

我的要求略有不同。 在我的情況下,我想在生產中編碼密碼,但在開發中使用純文本。 此外,我沒有訪問父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 ,其可能的值為shaplainText

你應該能夠做到這一點:

<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM