Присоединение VS ProceedingJoinPoint в АОП с использованием aspectJ?

Может ли кто-нибудь сказать мне, в чем разница между Joinpoint и Proceedingjoinpoint?

Когда использовать Joinpoint и Proceedingjoinpoint в методе класса аспект?

Я использовал 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() сделает для нас?

Ответ 1

@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

Совет вокруг - это специальный совет, который может контролировать, когда и если выполняется метод (или другая точка соединения). Это справедливо только для советов, поэтому для них требуется аргумент типа 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.

Еще одна особенность советов заключается в том, что они должны иметь возвращаемое значение, тогда как другие типы советов не должны иметь его.