1. 程式人生 > >spring aop 無法在內部巢狀的方法上生效

spring aop 無法在內部巢狀的方法上生效

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... } }

參考: