私は親抽象クラスと具象子クラスを持っています。抽象メソッドには、具体的なメソッドと子クラスが実装する抽象メソッドがあります。これらのクラスは両方ともSpring Beanとして設定されています。Spring:オブジェクトがベースクラスBeanと子クラスBeanの両方に注入された場合、値はnullです。
スプリング構成:コードスニペットは、以下に類似している
<bean id="parent" class="Parent" abstract="true">
<property name="propA" ref="propA"/>
<property name="cacheMan" ref="cacheMan"/>
</bean>
<bean id="child" class="Child" parent="parent">
<property name="propB" ref="propB"/>
<property name="cacheMan" ref="cacheMan"/>
</bean>
<!-- Of course, cacheMan is defined elsewhere and not relevant here.-->
クラス定義:
public abstract class Parent {
private A propA; // A is irrelevant.
private CacheManager cacheMan; // This is the object in question.
public void doProcess1() {
//code logic
if (cacheMan == null) {
// Error!
}
}
public void doProcess2();
}
public class Child extend Parent {
private B propB; // Again, B is irrelevant.
private CacheManager cacheMan; // This is the object in question.
public void doProcess2() {
//code logic
}
}
public class Test {
private Parent parent; //Assume this is Spring injected and it's of type Child.
public void doTest() {
parent.doProcess1(); // Error thrown since cacheMan is null.
}
}
これらのクラスの両方cacheMan
に適したゲッター/セッターメソッドを有します。私はdoProcess1()
メソッドでcacheMan
がnullであることを理解していません。しかし、私はその行を変更する場合
cacheMan == null
から、エラーがスローされません。
parent
がインスタンスChild
であるため、getCacheMan()
が子クラスに注入されたオブジェクトを取得していると思うので、nullではありません。
これが明白でない場合は、それを明記してお知らせください。
トマース、私はあなたに私が推測した説明を与えていると信じていますが、実際にはそれを得ていません。なぜ、抽象化されたキャッシュマンを単独で保持しないのでしょうか。子クラスがそれをオーバーライドしていることは理解していますが、その問題は「親の代わりに子インスタンスを取得する理由」のようなものでした。私はnullが親のcacheManフィールドに注入される修飾値であるかどうかわかりません。 – asgs
@asgs:それは事です、 'null'はあなたの親に注入されません!私はSpringが 'setCacheMan()'を2回呼び出すと思います.1回は親に対して、もう1回は子に対して、両方の呼び出しで正しい 'cacheMan'参照を提供します。しかし、このメソッドはオーバーライドされているので、子では 'setCacheMan()'が2回呼び出され、親では 'setCacheMan()'は呼び出されません。ここでも、これはSpringとはほとんど関係がありません。これはJavaの仕組みです。 'System.out'を' setCacheMan() 'の両方の実装に追加して、いつ呼び出すかを見てください。私は親のバージョンは決して呼び出されないだろう - そして、親の 'cacheMan'参照は決して更新されないでしょう。 –
私は両方のセッターにSOPを追加しました。子は親に依存しているため、親と子の順番(サーバーの起動中)の両方で実際に両方を呼び出します。それ以降に何が起こるか分からないと、親のcacheManがnullに設定されます。 – asgs