2012-01-06 69 views
0

我遇到了有關Spring AOP的問題。我嘗試使用方面來觸發一個方法,但將觸發方面的方法也是相同類的方法和方式不工作(順便說沒有錯誤)。像這樣如何爲同一類中的另一種方法調用的方法運行方面建議

class A extends Runnable{ 
    public void write(){ 
     System.out.println('Hi'); 
    } 

    public void run(){ 
     this.write(); 
    } 

} 

<aop:after-returning method="anyMethod" pointcut="execution(* A.write(..))"/> 

任何想法會理解

感謝

回答

1

的建議方法被調用在不同的線程沒有任何區別的事實。只要確保傳遞給線程的實例是由Spring應用程序上下文創建的,而不是由應用程序代碼創建的。另外,既然你建議在類中聲明一個方法,而不是一個接口 - write() - 你需要執行加載時織入(並且在你的類路徑中有cglib)。

+0

感謝您的回答。我認爲,我錯誤地寫了代碼。請檢查上面的新的請求。正如你可以看到新的那樣,線程正在調用屬於它自己的方法。這意味着,在這個操作中沒有與spring context的交互,因爲它稱之爲自己的方法。我現在該怎麼做? – Neron 2012-01-06 11:33:01

+0

@ user1072848這不是誰來調用它的問題,而是它是如何實例化的。 – 2012-01-06 11:49:13

+0

那麼我應該怎麼做來創建它就像你說的? – Neron 2012-01-06 11:55:35

0

這是因爲Spring AOP是基於代理的。您使用代理將調用委託給基礎對象。然而,當一個底層對象的方法調用其中的另一個方法時,同一個類(你的用例),代理不會進入畫面,因此你試圖實現的是不可能的。有一些解決方法,但他們殺死了AOP的目的。

您可以在這裏查看更多信息。

http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/aop.html#aop-understanding-aop-proxies

0

由於阿布舍克肖漢說,Spring AOP是基於代理的,因此無法攔截直接調用this.someMethod()。但好消息是,您還可以通過加載時編織在Spring應用程序中使用完整的AspectJ,如Spring manual中所述。這樣你可以擺脫限制,甚至是整個代理開銷,因爲AspectJ不需要任何代理。

相關問題