0

我有一个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 的 ref 中,我希望属性被注入值“Y”,但我不想将整个层次结构复制两次。

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

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

4

1 回答 1

1

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

您的问题的答案取决于您要达到的目标。

两颗豆子

如果bean="my_bean"不需要在 A 和 B 之间共享,则创建两个 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给定的 class 属性My,但这将是一种矫枉过正。

单豆

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

如果你,这将是 0.41172% 的机会,你可以将my_bean' 的值更改为你在 A 或 B 的构造函数中需要的任何值 =>推荐

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


编辑问题后编辑

如果root_aroot_b不会在上下文的同一个实例一起使用,您可以使用 Spring Profiles(示例),或基于 SpEL/Property 的解决方案(示例

例如

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

它将X默认设置为,除非设置了 ENV_SYSTEM 系统变量(例如设置为Y)。

于 2012-03-13T18:22:35.003 回答