当前位置: 首页 > 知识库问答 >
问题:

使用aspectJ的AOP中的连接点与处理连接点?

穆季萌
2023-03-14

有谁能告诉我连接点和过程连接点之间有什么区别吗?

在aspect类的方法中,何时使用连接点和处理连接点?

我在我的AeyJ类中使用了JoinPoint,如下所示:

@Pointcut("execution(* com.pointel.aop.test1.AopTest.beforeAspect(..))")  
public void adviceChild(){}  

@Before("adviceChild()")  
public void beforeAdvicing(JoinPoint joinPoint /*,ProceedingJoinPoint pjp - used refer book marks of AOP*/){ 

    //Used to get the parameters of the method !
    Object[] arguments = joinPoint.getArgs();
    for (Object object : arguments) {
        System.out.println("List of parameters : " + object);
    }

    System.out.println("Method name : " + joinPoint.getSignature().getName());
    log.info("beforeAdvicing...........****************...........");
    log.info("Method name : " + joinPoint.getSignature().getName());
    System.out.println("************************"); 
}

但我在其他资源中看到的是:

@Around("execution(* com.mumz.test.spring.aop.BookShelf.addBook(..))")
public void aroundAddAdvice(ProceedingJoinPoint pjp){
    Object[] arguments = pjp.getArgs();
    for (Object object : arguments) {
        System.out.println("Book being added is : " + object);
    }
    try {
        pjp.proceed();
    } catch (Throwable e) {
        e.printStackTrace();
    }
} 

这里,与“连接点”相比,处理连接点有什么不同?还有什么将pjp。继续()`为我们做什么?

共有3个答案

祁刚毅
2023-03-14

将JoinPoint与以下通知类型一起使用:

 @Before, @After, @AfterReturning, @AfterThrowing

使用具有以下建议类型的程序连接点:

@Around
濮阳驰
2023-03-14
@Around("execution(* com.mumz.test.spring.aop.BookShelf.addBook(..))")

这意味着在调用com.mumz.test.spring.aop.BookShelf.addBookmethodaroundAddAddge方法被调用。在System.out.println("正在添加的书是:"对象);操作完成后。它将调用您的实际方法。pjp.proceed()将调用addBook()方法。

巫培
2023-03-14

绕过建议是一种特殊的建议,可以控制方法(或其他连接点)何时以及是否执行。这仅适用于绕过建议,因此它们需要类型为ProcedingJoinPoint的参数,而其他建议仅使用简单的JoinPoint。示例用例是缓存返回值:

private SomeCache cache;

@Around("some.signature.pattern.*(*)")
public Object cacheMethodReturn(ProceedingJoinPoint pjp){
    Object cached = cache.get(pjp.getArgs());
    if(cached != null) return cached; // method is never executed at all
    else{
        Object result = pjp.proceed();
        cache.put(pjp.getArgs(), result);
        return result;
    }
}

在这段代码中(使用不存在的缓存技术来说明一个点),只有当缓存没有返回结果时才调用实际方法。例如,这正是Spring EHCache注释项目的工作方式。

around通知的另一个特点是,它们必须有返回值,而其他通知类型不能有返回值。

 类似资料:
  • 我正在研究一个算法,用来在图中找到所有的连接点,这里给出了。 这是计算艺术点数的函数: 现在我很难理解这段代码的某些行。 上面的陈述是否意味着,由于顶点“v”是顶点“u”的直接子点,如果有某个顶点是可以从“v”或“v”本身到达的,并且是在“u”之后发现的,那就意味着存在一个后边。 我的解释对吗?如果我错了请给我正确的解释。

  • 问题内容: 当我的MongoDB连接空闲几分钟后,下一个请求将错误结束。从命令行客户端,它看起来像这样: 我看到针对MongoHQ和MongoLab的沙箱实例的问题。 由于重新连接,下一个请求通过正常。这是我的网络应用程序中的一个问题,因为几分钟不活动后,在网络请求期间将出现此错误。有两件事让我感到惊讶: MongoDB连接被如此频繁和频繁地破坏,并且 驱动程序只是引发一个异常,而不是在重新连接后

  • 我需要一些关于Spring AOP连接点的信息。我在Stackoverflow中读过下面的文章,它解释了jointpoint和PointCut之间的区别。根据这一点,“joinpoint是应用程序执行过程中可以插入方面的候选点。这个点可以是被调用的方法,被抛出的异常,甚至是被修改的字段。这些点可以将方面的代码插入到应用程序的正常流中,以添加新的行为。” 当我读了这篇文章之后,看起来一个类中的每个方

  • 我的设置是在4个Wildfly10.1服务器节点前面安装一个Apache httpd2.4服务器。我使用mod_cluster进行负载平衡,大部分时间一切都运行良好。但每天都有几次,这会出现在Apache的错误日志中: 当这些错误出现时,用户抱怨他们被注销出了系统。发生这种情况是因为我使用的是粘滞会话,当错误出现时,每个人似乎都从一个节点移动到了另一个节点,这意味着他们的会话丢失了。 然而,即使日

  • 问题内容: 我刚刚开始使用BoneCP,这是我第一次使用连接池。对于应该如何使用它,我有些困惑。当前,我将BoneCP对象保存为静态变量,因此可以在不同的连接之间使用它。 连接完成后,用关闭。 我应该这样做,还是不应该关闭它以使其能够被池重用? 这是我当前获得连接的实现: 这似乎是正确的,还是我误解了我应该如何使用BoneCP? 问题答案: 除了使您的私有静态最终变量和将init更改为静态块(或者

  • 我有两个不同的方面类来计算测试程序执行的非静态方法调用的数量。第一个方面统计“调用”连接点上的方法: 第二个方面统计“执行”连接点上的方法: 是一个静态方法在计数器类。 小测试程序的方法调用次数相同。但是当我用一个更大的程序改变测试程序时,第二个方面类(带有执行切入点)中的方法调用数量比带有调用切入点的方面类中的方法调用数量多。这是合理的,因为呼叫连接点不会挑出用超级发出的呼叫,因此不会计算它们。