Java 在XMLArrayList中有条件地包含bean

Java 在XMLArrayList中有条件地包含bean,java,xml,spring,Java,Xml,Spring,我想知道是否有可能根据某些属性有条件地包括SpringBean 在我的applicationContext.xml中,我设置了一个bean列表: <bean id="server1Config" class="... /> <bean id="server2Config" class="... /> <bean id="server3Config" class="... /> ... 您的代码不应根据环境进行更改。如果您的目标是为每个环境使用不同的设置,则

我想知道是否有可能根据某些属性有条件地包括SpringBean

在我的
applicationContext.xml
中,我设置了一个bean列表:

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


您的代码不应根据环境进行更改。如果您的目标是为每个环境使用不同的设置,则在启动时将其作为属性加载


请参阅“”

这可以在SpringFramework 3.1以后的版本中使用内置的Spring环境概要文件来完成

以下是一些资源:


希望这能有所帮助。

因为您的名字指的是不同的阶段或环境,所以使用spring概要文件可能会有所帮助。您可以在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>
加载两个配置文件

ctx.getEnvironment().setActiveProfiles("profile1", "profile2");
以声明方式从CMD行加载:

-Dspring.profiles.active="profile1,profile2"
web.xml中的用法(可以用逗号分隔)


调度员
org.springframework.web.servlet.DispatcherServlet
spring.profiles.active
生产
@注释:如果您想使用属性进行操作,并且能够使用较新的spring元素、注释等。请参阅本教程[2],以使其与属性文件一起工作,如您在下面的注释所示

[1]
[2] 这几乎是@swinkler答案的补充

他给出了解决方案的第一部分,即Spring3.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列表,只向其中添加相关的配置。

我正在编译一个war文件,并且部署到的服务器只有一个Tomcat管理面板,因此没有命令行访问权限。有没有办法通过属性文件在XML中设置概要文件?关于您的问题,web.xml是设置spring概要文件的唯一方法吗?仍然是一个潜在的解决方案如果我可以使用配置文件从列表中排除项目,我如何从ArrayList中排除项目,或者,如果它们的bean与配置文件不匹配,它们会自动被排除吗?据我所知,只有spring boot才有一种机制,您可以将属性放在application.properties中,它将自动加载(),但据我所知,您没有使用这种机制。如果在Web应用程序中使用Spring,则基于Web.xml的Spring加载上下文。您是否看到该解决方案对您的应用程序有任何障碍?这里是另一个解决方案,如果您使用注释或考虑切换到Spring Prror是一个潜在的解决方案,现在我发现可以加载多个配置文件。我可以看到我将如何从初始化中排除bean,这会自动将它们从列表中排除,或者如果它们的配置文件不匹配,它们将作为null插入列表中?不使用Spring Boot,但如果将来使用Spring Boot,请记住这一点。
-Dspring.profiles.active="profile1,profile2"
  <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>
<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>