有条件地在XML ArrayList中包含bean

时间:2015-05-04 15:07:55

标签: java xml spring

我想知道是否有可能以某种方式有条件地包括一些属于春天豆类。

在我的applicationContext.xml我有一个我设置的bean列表:

<bean id="server1Config" class="... />
<bean id="server2Config" class="... />
<bean id="server3Config" class="... />
...

然后我将它们列入一个列表:

<bean class="java.util.ArrayList">
        <constructor-arg>
            <list>
                <ref bean="server1Config"/>
                <ref bean="server2Config"/>
                <ref bean="server3Config"/>
                ...
            </list>
    </constructor-arg>
</bean>

我想有条件地包括server1Config,server2Config,server3Config等,具体取决于${includeServer1} == true${includeServer2} == true等,如果可能的话,只有在标记为包含它们时才初始化这些bean。

为了澄清,它是一个ping服务,检查服务器是否在线,每个bean包含特殊的URL。如果我有5台服务器正在运行,我想设置我的配置includeServer1=true ... includeServer5=true ... includeServer6=false,如果我关闭服务器2,我就会这样做喜欢在关闭服务器之前更改includeServer2 = false,以免被SMSe轰炸,告诉我server2已离线。

3 个答案:

答案 0 :(得分:4)

由于您的名字涉及不同的阶段或环境,弹簧配置文件可能有助于使用。您可以在context.xml中定义这样的bean

<beans profile="dev">
    <jdbc:embedded-database id="dataSource">
        <jdbc:script location="classpath:com/bank/config/sql/schema.sql"/>
        <jdbc:script location="classpath:com/bank/config/sql/test-data.sql"/>
    </jdbc:embedded-database>
</beans>

<beans profile="production">
    <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/datasource"/>
</beans>

在示例[1]中,您可以看到两个名为&#34; dev&#34;和&#34;生产&#34;。

  • Spring将始终加载没有配置文件的每个bean
  • 根据配置文件(是的,您可以一次加载多个配置文件)将加载所有相关的bean

在Java中加载配置文件:

ctx.getEnvironment().setActiveProfiles("dev");

加载两个配置文件

ctx.getEnvironment().setActiveProfiles("profile1", "profile2");

以声明方式从CMD行加载:

-Dspring.profiles.active="profile1,profile2"

web.xml中的用法(可以用逗号分隔)

  <servlet>
      <servlet-name>dispatcher</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
          <param-name>spring.profiles.active</param-name>
          <param-value>production</param-value>
      </init-param>
  </servlet>

@Comment:如果你想使用属性来做,并且你可以使用更新的弹簧元素,注释等,请查看本教程[2],使其与属性文件一起使用,如下所示。< / p>

[1] http://spring.io/blog/2011/02/11/spring-framework-3-1-m1-released/ [2] http://kielczewski.eu/2013/11/setting-active-profile-and-property-sources-in-spring-mvc/

答案 1 :(得分:3)

这几乎是@swinkler答案的补充。

他给出了解决方案的第一部分,即使用Spring 3.1+配置文件。

第二部分是使用一种自动注册:

<bean class="java.util.ArrayList" id="serverConfigList"/>
<beans profile="server1">
    <bean id="server1Config" class="... />
    <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="targetObject"><ref local="serverConfigList"/></property>
        <property name="targetMethod"><value>add</value></property>
        <property name="arguments"><ref local="server1Config/></property>
    </bean>
</beans>

这样你就可以创建一个empy列表,只添加相关的配置。

答案 2 :(得分:1)

这可以在Spring框架3.1中使用内置的Spring环境配置文件完成。

以下是一些资源: http://java.dzone.com/articles/spring-31-environment-profiles

希望这有帮助。