0

Recently i came across a "strange" Spring behaviour which i do not know if it is the expected behavior or a bug.

I have two spring files:

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"/>

I also have two different objects(which implement BeanNameAware) that have a reference to "ConcreateChild". I was expecting that both objects will have a reference to the same ConcreateChild object. But this is not the case.

When i debug and try to see the BeanName one reference is giving me "ConcreateChild" (as expected) but the other "AnotherChild".

Does anyone know if this is expected? I would expect the same reference to "ConcreateChild" always.

Couldn't find any answers or explanation in Spring documentation thus i posted here.

Thanks.

4

2 回答 2

0

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

当您使用 abstract="true" 定义 bean 时,它不会创建它的实例。它只会创建定义了 id 的 bean 定义。

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

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

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

于 2012-10-26T08:04:53.273 回答
0

谢谢您的回答。

但是我有点困惑。首先,我不明白为什么要创建 3 个实例。我虽然将从我的 xml 文件创建 2 个实例。我认为在 Spring 中,如果您不指定 bean 的“范围”,默认情况下它是“单例”。因此,我希望创建两个对象,一个用于 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。

如果您需要任何进一步的解释,请告诉我。

于 2012-10-26T11:00:12.120 回答