如何在Spring中动态设置bean引用?

时间:2012-02-03 07:12:36

标签: java spring

<bean id="Mybean" class="Bean">   
  <property name="config" ref="dev"/>   
</bean>

<bean id="dev" class="Dev">
  <property name="x" ref="Dev1">
  <property name="y" ref="Dev2">
  <property name="z" ref="Dev3">
</bean>

<bean id="stag" class="Dev">
  <property name="x" ref="Stag1">
  <property name="y" ref="Stag2">
  <property name="z" ref="Stag3">
</bean>

在上面的场景中,bean config中的MyBean属性从环境变为环境。在开发时,配置的引用更改为dev。在分段中,引用更改为stag。在弹出文件中检查时出现问题。在签入之前,我们必须每次分析配置的引用。如果配置了dev值的配置引用,我们可能需要解释很多问题。

是否有任何解决方案可以使其自动化? 注意:Spring版本是2.0.1

6 个答案:

答案 0 :(得分:10)

使用Spring的PropertyPlaceholderConfigurer,删除未使用的bean:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
         <value>env.properties</value>
     </property>
</bean>

<bean id="Mybean" class="Bean">   
  <property name="config" ref="config"/>   
</bean>

<bean id="config" class="Config">
  <property name="x" ref="${x}">
  <property name="y" ref="${y}">
  <property name="z" ref="${z}">
</bean>

并且env.properties文件包含以下属性:

x=Dev1
y=Dev2
z=Dev3

x=Stag1
y=Stag2
z=Stag3

答案 1 :(得分:4)

  1. 通过specfiy设置占位符bean,让spring知道你想要占位符
  2. 使用“$ {env}”
  3. 设置“my bean”的配置

    例如:

    <beans>
    <bean id="configBean" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
               <property name="location"><value>env.properties</value></property>
    </bean> 
    
    <bean id="Mybean" class="Bean">   
      <property name="config" ref="${env}"/>   
    </bean>
    
    </beans>
    

    并且您需要将env = dev键值添加到env.properties文件

答案 2 :(得分:3)

假设您的意思是Spring 3.1,而不是Spring 2.1(它不存在),那么您可以使用新的&#34;环境配置文件&#34; 3.1中引入的功能。这允许您为每个环境定义一组bean,然后选择&#34; active&#34;一个在运行时。

有关示例,请参阅此SpringSource Blog Entry

答案 3 :(得分:2)

您可以使用PropertyPlaceholderConfigurer或使用@Profile

来执行此操作

另见

答案 4 :(得分:2)

PropertyPlaceholderConfigurer就是答案,但我想你可以在不需要为每个环境更新属性文件的情况下实现这一点。

我的建议如下:

  1. 使用PropertyPlaceholderConfigurer,但不创建属性文件
  2. 默认情况下,PropertyPlaceholderConfigurer首先尝试在属性文件中查找值,但如果失败,将在系统属性中查找一个值
  3. 所以你需要做的就是以同样的方式定义两个bean,即devstag ..这是一个很好的方法,因为你清楚地展示了不同的配置...如果你还添加了一些别名来清楚地显示你想要使用的设置,它会有所帮助。

    接下来,传入一个系统属性,定义您所处的模式...并理想地明确设置PropertyPlaceholderConfigurer以使用系统属性。

    所以..你的配置看起来像这样

    <bean 
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"     
        systemPropertiesMode="2"/>
    
    <bean id="Mybean" class="Bean">   
      <property name="config" ref="${launch.mode}"/>   
    </bean>
    
    <bean id="dev" name="dev_mode" class="Dev">
      <property name="x" ref="Dev1">
      <property name="y" ref="Dev2">
      <property name="z" ref="Dev3">
    </bean>
    
    <bean id="stag" name="staging_mode" class="Dev">
      <property name="x" ref="Stag1">
      <property name="y" ref="Stag2">
      <property name="z" ref="Stag3">
    </bean>
    

    然后,您可以在启动时以下列方式传入属性

    -D<property-name>=<value>
    

    所以在这种情况下你会使用

    -Dlaunch.mode=dev_mode
    

    或者

    -Dlaunch.mode=staging_mode
    

    您无需触摸任何配置文件。

    关于systemPropertiesMode的进一步说明,接受的值如下:

    • 0 - 永远不会查看系统属性
    • 1 - 使用系统属性作为后备(即如果在属性文件中找不到)
    • 2 - 系统属性总是覆盖(我建议的模式)

    希望有所帮助:)

    注意:此建议仅适用于Spring&lt; 3.1,从3.1开始,推荐的方法是使用@Profile

答案 5 :(得分:1)

Spring提供了一种称为属性占位符的机制。这样,您可以在数据库/属性文件中设置某些属性,spring将在启动时填充它们。

用于此目的的课程位于here