使用aspectJ在AOP中使用Joinpoint VS ProceedingJoinPoint?

时间:2013-04-03 07:28:26

标签: java spring aspectj spring-aop

任何人都可以告诉我JoinpointProceedingjoinpoint之间有什么区别吗?

何时在方面类的方法中使用JoinpointProceedingjoinpoint

我在JoinPoint中使用了AspectJ class

@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()会为我们做些什么?

3 个答案:

答案 0 :(得分:23)

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

周围建议的另一个特点是它们必须具有返回值,而其他建议类型不能有一个。

答案 1 :(得分:9)

@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()方法。

答案 2 :(得分:1)

JoinPoint 用于以下建议类型:

 @Before, @After, @AfterReturning, @AfterThrowing

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

@Around