1

我想知道是否可以跨在同一 JVM中运行的所有应用程序(例如 Glassfish 域)拦截所有调用javax.persistence.EntityManager.flush()。

以下还没有帮助;-(

@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);
    }
}
4

1 回答 1

1

我对应用程序服务器/容器几乎一无所知,但基本上它应该是一个类加载问题。您有两个选择,始终假设要拦截的类在 JVM 中仅加载一次,而不是每个逻辑应用程序容器一次(在这种情况下,您将需要另一种方法,但它仍然是可能的):

  • 编译时二进制编织:编织包含要拦截的类的容器的 JAR 文件,创建新的 JAR 并用它们替换原始 JAR。在这种情况下,您只需要引导类路径中的 AspectJ 运行时 JAR 即可使其工作。

  • 加载时编织:将 AspectJ weaver JAR 放在 JVM 的引导类路径中,并在加载时将建议应用于目标类。

于 2012-11-04T11:50:56.597 回答