Guice的AOP扩展不适用于超类型

时间:2013-08-28 18:50:38

标签: aop guice cglib

我有以下层次结构:

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的构造函数?

1 个答案:

答案 0 :(得分:0)

Cglib创建了一个动态子类,它覆盖了一个截获的方法,其中Guice在这个重写方法中应用了它的魔法。这只能在&#34; top&#34;方法,但不适用于#grand; grand parent&#34;方法。因此,只有RepositoryBase中的方法被拦截,而Base中定义的方法是从Guice中隐藏的。

请注意,在技术上可以创建调用祖父方法的字节代码。但是Cglib没有提供这样的功能。

相关问题