使用 aspectJ 的 AOP 中的 Joinpoint VS ProceedingJoinPoint?

新手上路,请多包涵

谁能告诉我 JoinpointProceedingjoinpoint 之间有什么区别?

aspect类的方法什么时候用 JoinpointProceedingjoinpoint

我在我的 AspectJ 类中使用了 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();
    }
}

这里 ProceedingJoinPoint 与’JointPoint ? Also what will pjp.proceed()` 相比有何不同?

原文由 Human Being 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 758
2 个回答
@Around("execution(* com.mumz.test.spring.aop.BookShelf.addBook(..))")

这意味着在调用 com.mumz.test.spring.aop.BookShelf.addBook 方法之前 aroundAddAdvice 方法被调用。 System.out.println("Book being added is : " + object); 操作完成后。它将调用您的实际方法 addBook()pjp.proceed() 将调用 addBook() 方法。

原文由 abishkar bhattarai 发布,翻译遵循 CC BY-SA 3.0 许可协议

环绕通知是一种特殊的通知,可以控制何时以及是否执行方法(或其他连接点)。这仅适用于周围建议,因此它们需要类型为 ProceedingJoinPoint 的参数,而其他建议仅使用普通 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 Annotations 项目的确切工作方式。

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

原文由 Sean Patrick Floyd 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题