Spring bean覆盖bug /功能

时间:2012-10-25 16:47:17

标签: spring javabeans override

最近我遇到了一个“奇怪的”Spring行为,我不知道它是预期的行为还是错误。

我有两个弹簧文件:

FileA.xml

<bean id="AbstractParent" class="com.classes.MyAbstractClass" abstract="true"/>    
<bean id="ConcreateChild parent="AbstractParent" />

FileB.xml

<import resource="FileA.xml"/>
<bean id="AnotherChild" parent="AbstractParent" />
<bean id="ConcreateChild" parent="AnotherChild"/>

我还有两个不同的对象(实现BeanNameAware),它们引用了“ConcreateChild”。我原以为两个对象都会引用同一个ConcreateChild对象。但事实并非如此。

当我调试并尝试查看BeanName时,一个引用给了我“ConcreateChild”(如预期的那样),但另一个引用了“AnotherChild”。

有人知道这是否是预期的?我总是期望对“ConcreateChild”的引用相同。

在Spring文档中找不到任何答案或解释,因此我发布在这里。

感谢。

2 个答案:

答案 0 :(得分:0)

我认为你错过了在Spring中理解父和抽象的概念。

使用abstract =&#34; true&#34;定义bean时,它不会创建它的实例。它只会创建id定义的bean定义。

另一方面,当您对特定bean使用parent属性时,它将创建该bean的实例,其中包含在父定义中定义的信息以及在其自己的bean中定义的定义。当然,如果设置了一些冲突的属性,孩子将获胜。

在您的情况下,第一个ConcreateChild是使用AbstractParent信息创建的实例的结果。但第二个是使用来自AnotherChild的信息创建的实例的结果,也是使用来自Abstract Parent的信息创建的。

因此,在这种情况下,您实际上有3个相同bean的实例,这些实例是使用AbstractParent的bean定义创建的。

答案 1 :(得分:0)

感谢您的回答。

然而我有点困惑。首先,我不明白为什么会创建3个实例。我虽然将从我的xml文件创建2个实例。我想在Spring中,如果没有指定bean的'scope',默认情况下它是'singleton'。因此,我希望为id =“AnotherChild”创建一个对象,为id =“ConcreateChild”创建一个对象。我不希望有两个“ConcreateChild”实例。

另外关于我的问题想象一下,我的配置中有下两个bean:

<bean id="Primary" class="ImplementingClass">
<property name="AbstractParent" ref="ConcreateChild" />
</bean>


<bean id="Secondary" class="ImplementingClass">
<property name="AbstractParent" ref="ConcreateChild" />
</bean>

以上两个bean不是一个接一个地创建的,但它们都引用了“ConcreateChild”对象。当我在一个案例中查找该对象的实例时,它是“ConcreateChild”,而在另一种情况下,它是“AnotherChild”。这实际上是我不明白的。我希望对象的实例在两个bean中都是相同的,或者至少两个都将“ConcreateChild”作为id。

如果您需要进一步说明,请告诉我。