在使用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
中运行时添加另外两个条目,还有另外两个要添加的条目。
这是可能的,如果没有,我的替代方案是什么?
答案 0 :(得分: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
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