最近我遇到了一个“奇怪的”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文档中找不到任何答案或解释,因此我发布在这里。
感谢。
答案 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。
如果您需要进一步说明,请告诉我。