23

Joinpoint谁能告诉我和 和 有什么区别Proceedingjoinpoint

什么时候在切面类的方法中Joinpoint使用?Proceedingjoinpoint

JoinPoint在我的 AspectJ 类中使用了,例如:

@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 pjp.proceed()` 相比,这里有什么不同之处? Also what will呢?

4

3 回答 3

33

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

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

于 2013-04-03T09:39:18.297 回答
12
@Around("execution(* com.mumz.test.spring.aop.BookShelf.addBook(..))")

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

于 2013-04-03T08:35:34.690 回答
3

JoinPoint与以下建议类型一起使用:

 @Before, @After, @AfterReturning, @AfterThrowing

ProceedingJoinPoint与以下建议类型一起使用:

@Around
于 2020-08-05T12:36:01.193 回答