我有以下层次结构:
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的构造函数?
答案 0 :(得分:0)
Cglib创建了一个动态子类,它覆盖了一个截获的方法,其中Guice在这个重写方法中应用了它的魔法。这只能在&#34; top&#34;方法,但不适用于#grand; grand parent&#34;方法。因此,只有RepositoryBase
中的方法被拦截,而Base
中定义的方法是从Guice中隐藏的。
请注意,在技术上可以创建调用祖父方法的字节代码。但是Cglib没有提供这样的功能。