Java - Spring - 根据某些条件将条目放入地图中

时间:2015-01-30 08:27:41

标签: java spring

在使用Spring(Spring版本3.2.3)的Java应用程序中,
我有这样的事情:

<bean id="pm" class="com.test.PropertyManager">
    <property name="targets">
        <map>
            <entry key="key01" value-ref="obj01" />
            <entry key="key02" value-ref="obj02" />
            <entry key="key03" value-ref="obj03" />
            <entry key="key04" value-ref="obj04" />
            <entry key="key05" value-ref="obj05" />
            <entry key="key06" value-ref="obj06" />
        </map>
    </property>
</bean>

有没有办法告诉Spring不要将所有条目都放在这张地图中 但只有部分基于某些属性,其价值可以是 不同的环境,应用程序是为其构建和运行的。

我的意思是,我正在寻找类似的东西:

<bean id="pm" class="com.test.PropertyManager">
    <property name="targets">
        <map>
            <entry key="key01" value-ref="obj01" if="${env1}"/>
            <entry key="key02" value-ref="obj02" if="${env1}"/>
            <entry key="key03" value-ref="obj03" unless="${env1}"/>
            <entry key="key04" value-ref="obj04" unless="${env1}"/>
            <entry key="key05" value-ref="obj05" />
            <entry key="key06" value-ref="obj06" />
        </map>
    </property>
</bean>

所以,例如我想要在应用程序位于环境env1时添加两个条目,当应用程序在另一个env2中运行时添加另外两个条目,还有另外两个要添加的条目。

这是可能的,如果没有,我的替代方案是什么?

1 个答案:

答案 0 :(得分:2)

有不同的选择:

  1. 如果每个环境需要不同的bean配置,则可以使用配置文件:
  2. <beans profile="dev">
            <bean id="pm" class="com.test.PropertyManager">
                <property name="targets">
                  ...
                </property>
            </bean>
        </beans>
        <beans profile="production">
            <bean id="pm" class="com.test.PropertyManager">
                <property name="targets">
              ...
                </property>
            </bean>
        </beans>
    

    有关XML配置文件的更多信息:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-definition-profiles-xml

    1. 如果您需要更多灵活性,请使用工厂(使用Java配置,这很简单):
    2.     public class PropertyManagerFactory {   
              public static PropertyManager getInstance() { 
                  // Your initialization code (check env vars to build the map...)
              }
          }
      

      Bean定义(注意factory-method):

      <bean id="propertyManager" class="com.test.PropertyManagerFactory" factory-method="getInstance" />
      

      用法(这里将注入getInstance方法返回的内容):

      <bean id="accountService" class="com.test.AccountServiceImpl">
         <property name="propertyManager" ref="propertyManager"/>
      </bean>
      

      有关使用工厂方法的更多信息:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-factory-class-static-factory-method