0

最近、「奇妙な」Spring の動作に遭遇しました。これは、予想される動作なのかバグなのかわかりません。

私は2つの春のファイルを持っています:

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

「ConcreateChild」への参照を持つ 2 つの異なるオブジェクト (BeanNameAware を実装する) もあります。両方のオブジェクトが同じ ConcreateChild オブジェクトへの参照を持つことを期待していました。しかし、そうではありません。

デバッグして BeanName を表示しようとすると、1 つの参照が "ConcreateChild" (予想どおり) を提供していますが、もう 1 つの参照は "AnotherChild" を提供しています。

これが予想されるかどうかは誰にもわかりますか?「ConcreateChild」への同じ参照が常に期待されます。

Spring のドキュメントに回答や説明が見つからなかったため、ここに投稿しました。

ありがとう。

4

2 に答える 2

0

ご回答ありがとうございます。

しかし、私は少し混乱しています。まず、3 つのインスタンスが作成される理由がわかりません。私のxmlファイルから2つのインスタンスが作成されます。Spring では、Bean の「スコープ」を指定しないと、デフォルトで「シングルトン」になると思いました。したがって、id="AnotherChild" 用と id="ConcreateChild" 用の 2 つのオブジェクトが作成されると予想されます。「ConcreateChild」の 2 つのインスタンスは期待できません。

さらに、私の質問について、構成に次の 2 つの Bean があると想像してください。

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


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

上記の 2 つの Bean は次々に作成されませんが、両方とも「ConcreateChild」オブジェクトを参照しています。そのオブジェクトのインスタンスを探すと、ある場合は「ConcreateChild」であり、他の場合は「AnotherChild」です。これは実際には私が理解していないことです。オブジェクトのインスタンスが両方の Bean で同じであるか、少なくとも両方の Bean が ID として「ConcreateChild」を持つことを期待します。

さらに説明が必要な場合は、お知らせください。

于 2012-10-26T11:00:12.120 に答える
0

Springの親と抽象の概念を理解していないと思います。

abstract="true" で Bean を定義すると、そのインスタンスは作成されません。ID が定義された Bean 定義のみを作成します。

一方、特定の Bean に親属性を使用すると、親の定義内で定義された情報と、独自の Bean 内で定義された定義を使用して、その Bean のインスタンスが作成されます。もちろん、競合するプロパティが設定されている場合は、子が勝ちます。

あなたの場合、最初の ConcreateChild は、AbstractParent からの情報で作成されたインスタンスの結果です。しかし、2 つ目は、Abstract Parent からの情報を使用して作成された、AnotherChild からの情報を使用して作成されたインスタンスの結果です。

したがって、この場合、実際には、AbstractParent の Bean 定義を使用して作成された同じ Bean の 3 つのインスタンスがあります。

于 2012-10-26T08:04:53.273 に答える