0

次の階層構造があります。

public class ItemImpl extends RepositoryBase<ItemImpl> { 
   @Inject
   ItemImpl( dependency ) { 
      super( dependency )
   }
}

public class RepositoryBase<T> extends Base<T> {
   public RepositoryBase( dependency ) { //Constructor without @Inject
      super( dependency )
   }

   @Intercept <--- Works
   public someMethod( ) {}
}

public class Base<T> {
   public Base( dependency ){ } //Constructor without @Inject

   @Intercept <--- Does not work ***
   public someMethod( ) {}
}

上記のように、傍受は階層のレベル 3 では機能しません。Guice の AOP 制限によると、インスタンスは Guice を使用して作成する必要があり、子 ItemImpl には @Inject を持つコンストラクターがあるため、この子の親が機能するはずだと推測しました。

レベル 3 で傍受が機能しないのはなぜですか? レベル 2 で傍受が機能するのはなぜですか? 親の両方に@Injectのコンストラクターがありませんか?

4

1 に答える 1

0

Cglib は、傍受されたメソッドをオーバーライドする動的サブクラスを作成します。そこでは、このオーバーライドされたメソッドで Guice が魔法を適用します。これは「最上位」メソッドでのみ実行でき、「親の親」メソッドでは実行できません。したがって、 で定義されたメソッドが Guice から隠されRepositoryBaseている間に、 のメソッドのみがインターセプトされます。Base

祖父母メソッドを呼び出すバイトコードを作成することは技術的に可能であることに注意してください。ただし、Cglib はそのような機能を提供しません。

于 2013-12-29T00:57:27.430 に答える