Spring Conditional Bean创建基于另一个bean

时间:2014-12-15 23:06:01

标签: java xml spring spring-el

我正在尝试使用Spring 3.2和XML配置,在另一个bean / property的值为true时,找到一种只创建bean的方法。

<bean id="isEnabled" class="java.lang.Boolean">
    <bean factory-bean="configurationService" factory-method="getBooleanValue">
               <constructor-arg index="0">
                   <util:constant static-field="org.code.ConfigurationKeys.ENABLED"/>
               </constructor-arg>
    </bean>
</bean>  

<if isEnabled=true>
   ..... create some beans
</if>

我看过使用Spring EL的一些略有相似的例子,但没有任何东西可以做到这一点......

2 个答案:

答案 0 :(得分:3)

您可以使用个人资料。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-3.2.xsd" >


   <!-- here goes common beans -->

    <beans profile="Prof_1">
        <import resource="./first-config.xml" />
    </beans>
    <beans profile="Prof_2">
        <import resource="./second-config.xml" />
    </beans>
</beans>

可以同时激活多个配置文件或选择不激活任何配置文件。要激活有多种方法,但要以编程方式执行此操作,我们需要在web.xml中添加初始化程序

<context-param>
    <param-name>contextInitializerClasses</param-name>
    <param-value>com.test.MyCustomInitializer</param-value>
</context-param>

MyCustomInitializer如下所示

public class MyCustomInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        try {
            String activeProf;
            // some logic to either read file/env variable/setting to determine which profile to activate
            applicationContext.getEnvironment().setActiveProfiles( activeProf );
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

答案 1 :(得分:0)

为什么在需要时不使用工厂来创建对象并使它们变得懒惰。

<bean id="second "class="xxx.xxx.Class" lazy-init="true" scope="prototype"/>

没有办法在spring配置中引入if语句,配置文件可以工作但与环境更相关而不是程序化配置。