我想知道在相同JVM 中运行的所有应用程序中是否可以拦截所有调用来表示javax.persistence.EntityManager.flush()(例如Glassfish域名。
以下没有帮助; - (
@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 :(得分:1)
我对应用程序服务器/容器几乎一无所知,但基本上它应该是一个类加载问题。您有两个选项,总是假设要拦截的类只在JVM中加载一次,而不是每个逻辑应用程序容器加载一次(在这种情况下,您需要另一种方法,但仍然可以):
编译时二进制编织:编织包含要拦截的类的容器的JAR文件,创建新的JAR并用它们替换原始文件。在这种情况下,您只需要在引导类路径上使用AspectJ运行时JAR,以使其正常工作。
加载时编织:将AspectJ weaver JAR放在JVM的引导类路径上,并在加载时将建议应用于目标类。