2012-08-02 69 views
3

我想通知AspectJ和Spring的javax.persistence.EntityManager。這是行不通的:沒有錯誤,沒有「中招」在控制檯上...建議javax.persistence.EntityManager與AspectJ不起作用

這裏是我的方面:

package trc.suivi.aspects; 

public aspect EventManagerAspect { 

    public EventManagerAspect() {} 

    pointcut catchIt() : (execution(* javax.persistence.EntityManager.persist(..))); 

    after() returning: catchIt() { 
     System.out.println("caught"); 
    } 

} 

這是我如何配置我的方面在春季:

<bean class="trc.suivi.aspects.EventManagerAspect" factory-method="aspectOf"/> 
+0

使用'call'而不是'execution'工作。爲什麼是這樣的:我不知道......如果AspectJ中更經驗豐富的人可以跳出來提供一個很好的解釋。 – balteo 2012-08-02 14:00:10

回答

3

調用和執行之間的區別是:

call你建議你的代碼,execution你建議目標代碼(在這種情況下,建議粗略的意思是:改變字節代碼)。由於目標代碼位於編譯器無法訪問的jar文件中,因此無法使用。

使用call將在大多數情況下使用,但如果您絕對需要使用execution,則必須使用aspectj重新編譯外部庫或使用加載時編織。

+0

雖然有一個問題:是'javax.persistence.EntityManager'考慮**我的代碼**? – balteo 2012-08-02 15:12:04

+1

不,它在外部的罐子裏。您的代碼是您正在編譯的代碼。你沒有編譯Entitymanager,你正在鏈接它。這是一個區別。 – 2012-08-02 15:31:57