spring aop 無法在內部巢狀的方法上生效
阿新 • • 發佈:2019-02-05
1,問題
例子:
public void method1(){
.........
method2();
...........
}
public void method2(){
...............
...............
}
結果:當你呼叫method1,並且在method1方法裡面呼叫method2方法時,設定在method2上的“攔截/代理”是無效的。
2,原因
我們想想代理模式,程式碼如下:
public class ProxyObject {
// 被代理的物件
private ProxiedObject proxiedObject
public ProxyObject(proxiedObject proxiedObject) {
this.proxiedObject = proxiedObject;
}
public void method1() {
proxiedObject.method1();
}
}
解釋:
在呼叫代理物件的方法時,內部其實呼叫的還是真正的例項(proxiedObject)方法。例項方法的method1被呼叫時,內部呼叫method2的方式是:this.method2()
,所以呼叫的是真正的method2,而不是被攔截的method2。
3,如何解決問題
1,可以使用Eclipse基金的AspectJ實現來解決。AspectJ使用編譯期位元組碼織入(weave)的方式,在編譯的時候,直接修改類的位元組碼,把所定義的切面程式碼邏輯插入到目標類中。而不像Spring是使用代理類的方式來做的。
2,如果想要使用Spring實現的話,可以用下面的方法實現,但這樣的程式碼的耦合性就太強了,是個很差的方案。
public class SimplePojo implements Pojo {
public void foo() {
// this works, but... gah!
((Pojo) AopContext.currentProxy()).bar();
}
public void bar() {
// some logic...
}
}
參考: