2014-02-07 43 views
0

爲什麼Spring AOP不能用於其他方法中的方法調用?爲什麼Spring AOP不能用於其他方法中的方法調用?

public class TestAOPService { 
    public String getSum(int val1) { 
     System.out.println(val1); 

     calculateSum(val1, 12); 
    } 

    public void calculateSum(int val1, int val2){ 

     System.out.println("Sum" + (val1 + val2)); 
    } 

} 

任何人都可以解釋如何做到這一點?

回答

1

Because of how proxying works.

例如,Spring創建一個豆,TestAOPService類型的一個實例。然後它意識到它需要代理它來添加方面建議。它將採用實例的類(和接口)類型,並創建一個JDK代理或一個CGLIB代理。

代理將在執行通知之後將實際實例和委託包裝在/ around /之前。

它看起來像這樣

Caller --> Proxy.getSum(..) --> Bean.getSum(..) 

所以調用者調用代理上的方法和代理包含在建議的行爲。但是,如果你調用該實例的方法中的實例的方法,它看起來像這樣

Caller --> Proxy.getSum(..) --> Bean.getSum(..) --> Bean.calculateSum(..) 

在代碼中,你有這樣的

public String getSum(int val1) { 
    System.out.println(val1); 

    calculateSum(val1, 12); 
} 

這實際上是

public String getSum(int val1) { 
    System.out.println(val1); 

    this.calculateSum(val1, 12); 
} 

該方法直接在實例上調用,而不是在代理上調用。因此不能應用任何建議。

相關問題