2013-08-28 57 views
0

我有以下層次結構:Guice的AOP擴展不工作的超類型

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

你如何獲得'RepositoryBase '和'Base '的實例?我不明白Guice是如何創建這些實例的,因爲它需要'@ Inject'註釋構造函數或零參數構造函數。 – condit

回答

0

Cglib創建一個動態子類,它覆蓋了一個截獲的方法,其中Guice在這個重寫方法中應用了它的魔法。這隻能用於「頂級」方法,而不能用於「祖父」方法。因此,只有RepositoryBase中的方法被攔截,而Base中定義的方法對Guice隱藏。

請注意,創建調用父級方法的字節碼在技術上是可行的。然而Cglib不提供這樣的功能。