2012-10-25 149 views
1

我想知道是否有可能攔截所有來電說javax.persistence.EntityManager.flush(),橫跨同一個JVM運行(如Glassfish的所有應用程序域)。AOP攔截器攔截所有的應用程序在同一個JVM

繼不幫助還;-(

@Aspect 
public class TraceAspect { 

    @Pointcut("within(@(@javax.persistence.PersistenceContext *) *)") 
    public void entityManagers() { 
    } 

    @Pointcut("execution(@javax.persistence.EntityManager *.merge) && args(object)") 
    public void merge(Object o) { 
    } 

    @Pointcut("execution(@javax.persistence.EntityManager *.createQuery) && args(string)") 
    public void createQuery(String s) { 
    } 

    @AfterReturning("entityManagers() && merge(object)") 
    public void afterMerge(JoinPoint joinPoint) { 
     System.out.println(joinPoint); 
    } 

    @AfterReturning("entityManagers() && createQuery(string)") 
    public void afterCreateQuery(JoinPoint joinPoint) { 
     System.out.println(joinPoint); 
    } 
} 
+0

我相信你會需要一個加載時編織方式(http://www.eclipse.org/aspectj/doc/next/devguide/ltw.html)比你的方面將被執行的所有類是在加載時間wowen - 無論你有沒有他們的來源 –

+0

我知道這一個是舊的,但仍列爲未答覆。如果看起來合適,請您接受並提出我的答案嗎?謝謝。 – kriegaex

回答

1

我知道旁邊沒有關於應用服務器/容器,但基本上它應該是一個類加載的問題。你有兩種選擇,總是假設類是攔截在JVM中每個邏輯應用程序容器裝載只有一次,沒有一次(在這種情況下,你就需要另一種方法,但它仍然是可能的):

  • 編譯時二進制編織:編織你的容器的JAR包含類t的文件o被攔截,創建新的JAR並由他們替換原件。在這種情況下,您只需在引導類路徑上使用AspectJ運行時JAR就可以使其工作。加載時織入:將AspectJ weaver JAR放入JVM的引導類路徑中,並在加載時將建議應用於目標類。