我有一个带有属性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代码...
答案 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_a
和root_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
。