1

親の抽象クラスと具象の子クラスがあります。抽象メソッドには、子クラスが実装する1つの具象メソッドともう1つの抽象メソッドがあります。これらのクラスは両方ともSpringBeanとして構成されています。コードスニペットは次のようになります。

Spring Config:

<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.
        }
}

これらのクラスは両方とも、に適切なゲッター/セッターメソッドを持っていますcacheMancacheManメソッドでどのようにnullになっているのかわかりませんdoProcess1()。ただし、その行をから変更すると

cacheMan == nullgetCacheMan() == null、エラーはスローされません。

はインスタンスのものであり、それがnullではない理由であるgetCacheMan()ため、は子クラスに注入されたオブジェクトを取得していると思います。parentChild

それに光を当てて、これが明確でない場合は私に知らせてください。

4

1 に答える 1

2

この問題は、Spring ではなく、Java 言語 (具体的にはメソッドのオーバーライド) に関連しています。

setCacheMan()抽象親クラスと子クラスの両方でメソッドが定義されています(それが私が想定していることです)。Spring がそのメソッドを呼び出すと、常に子でオーバーライドされたバージョンが呼び出され、そのバージョンはcacheMan子の参照も変更します。cacheMan親の参照は、それにアクセスする唯一のメソッドが子でオーバーライドされるため、実際にはまったく変更されません。

その行を からcacheMan == nullに変更するgetCacheMan() == nullと、エラーはスローされません。

これは、すでに述べたことから明らかです。これgetCacheMan()もオーバーライドされます。cacheMan親での参照はnull(上記を参照) ですが、getCacheMan()オーバーライドされているcacheManため、親ではなく子でアクセスします。実質的に 2 つの変数がありますが、子の変数は更新できません。

解決策: 親 Bean の考え方は、共通の依存関係を 1 か所にまとめ、すべての子で重複しないようにすることです。

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

そして、子クラスがそれにアクセスできるように、保護されていると宣言するかcacheMan、少なくとも保護されたゲッターを持っています。cacheMan子クラスにフィールドを作成しないでください。

于 2012-04-24T22:11:40.913 に答える