Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AOP拦截器拦截同一JVM中的所有应用程序_Java_Aop_Aspectj - Fatal编程技术网

Java AOP拦截器拦截同一JVM中的所有应用程序

Java AOP拦截器拦截同一JVM中的所有应用程序,java,aop,aspectj,Java,Aop,Aspectj,我想知道是否有可能拦截所有调用,比如javax.persistence.EntityManager.flush(),跨越运行在同一JVM(例如Glassfish域)中的所有应用程序 现在还没有帮助-( 我对应用程序服务器/容器几乎一无所知,但基本上这应该是一个类加载问题。您有两种选择,总是假设要拦截的类在JVM中只加载一次,而不是每个逻辑应用程序容器加载一次(在这种情况下,您需要另一种方法,但仍然可能): 编译时二进制编织:编织容器的JAR文件,其中包含要拦截的类,创建新的JAR并用它们替换原

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

现在还没有帮助-(


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

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

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


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

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

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


我相信您需要一段加载时间()您的方面将在加载时为所有wowen类执行-无论您是否有它们的源代码我知道这一个是旧的,但仍然列为未答复。如果合适,请接受并更新我的答案?谢谢。我相信您将需要加载时编织()您的方面将在加载时为所有wowen类执行-无论您是否有它们的源代码我知道这一个是旧的,但仍然列为未答复。如果合适,请您接受并更新我的答案?谢谢。
@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);
    }
}