根据其上下文为spring bean属性注入不同的值

时间:2012-03-13 14:59:25

标签: spring spring-el

我有一个带有属性my_bean的spring bean my_map,我想用值“X”或值“Y”注入它。豆子:

<bean id="my_bean">
  <property name="my_map">
    <map>
      <entry key="p" value="X" />
    </map>
  </property>
</bean>

它由bean root_a以非常深的层次结构引用:

<bean id="root_a">
  <ref bean="root_a_a"/>
</bean>
<bean id="root_a_a">
  <ref bean="root_a_a_a"/>
</bean>
<bean id="root_a_a_a">
  <ref bean="my_bean"/>
</bean>

并且从bean root_b再次引用整个深层次结构。在这个层次结构的my_bean的引用中,我将为属性注入值“Y”,但我不想复制整个层次结构两次。

<bean id="root_b">
  <ref bean="root_a_a"/>
</bean>

我如何在Spring XML中执行此操作?你能想到一个聪明的弹簧EL解决方案吗?别的什么?我更喜欢在XML中完成所有配置,而不是Java代码...

1 个答案:

答案 0 :(得分:1)

默认情况下,Spring bean是单例,这意味着一旦创建bean="my_bean",它就会在其他组件之间共享,例如在A =&gt;之间共享bean id="root_a_a_a"和B =&gt; bean id="root_b_b_b"

您的问题的答案取决于您想要实现的目标。

两个豆

如果不需要在A和B之间共享bean="my_bean",那么创建两个bean:

将此注入A

<bean id="myBeanX" class="My">
  <property name="culprit" value="X"/>
</bean>

这一到B

<bean id="myBeanY" class="My">
  <property name="culprit" value="Y"/>
</bean>

注意它们都是同一个类的实例。

如果您不需要其他任何内容,也可以将它们内联到协作者(A / B)中:

<bean id="root_a_a_a">
  <constructor-arg>
    <bean class="My">
      <property name="culprit" value="X"/>
    </bean>
  </constructor-arg>
</bean>

你也可以拥有一个工厂bean来创建root_a_a_a给定类My的属性,但那将是一种过度杀伤。

单豆

如果A和B需要与bean="my_bean"共享完全相同的引用,问题是:在创建my_bean后,A和B是否可以更改my_bean的状态? ?可能

如果 ,那将是0.41172%的几率,您可以将my_bean的值更改为A或B的构造函数中所需的值=&gt;将推荐

因此,你要么采用Two Bean方法(这很可能是你想要的),要么你需要将“X”和“Y”的属性重构为另一个例子。 myConfig组件。


编辑问题后

编辑

如果root_aroot_b 在同一个上下文实例中一起使用,则可以使用Spring配置文件(example)或SpEL /基于属性的解决方案(example

e.g。

<bean id="my_bean">
  <property name="my_map">
    <map>
      <entry key="p" value="${ENV_SYSTEM:X}" />
    </map>
  </property>
</bean>

除非设置了ENV_SYSTEM系统变量(例如X),否则默认情况下会将其设置为Y