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

标签 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. 如果您需要每个环境不同的 Bean 配置,您可以使用配置文件:
<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

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

    Bean 定义(注意工厂方法):

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

    用法(这里将注入(inject)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

    关于Java - Spring - 根据某些条件将条目放入 map 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28231942/

    相关文章:

    java - 如何在启动 MainActivity 时直接选择 fragment 类?

    java - 如何使用 Spring RESTful Web 服务观看视频

    java - while(true) 和 wait() 或线程 join() 之间有什么区别

    Spring Actuator 和 @DataJpaTest 找不到 CounterService bean

    java - 如何从applicationContext.xml中的bean读取值?

    java - Spring 安全: get password in UserDetailsServiceMethod

    java - Spring继承,多对多,实体映射中的重复列

    java - JFormattedTextfield.selectAll() 在格式化文本时不起作用

    java - VM初始化时出错;无法为对象堆保留足够的空间;无法创建Java虚拟机

    小型 VPS 上的 Java Servlet 容器