Joinpoint против ProceedingJoinPoint в AOP с использованием aspectJ?

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

при использовании Joinpoint и Proceedingjoinpoint в методе класса aspect ?

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

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() метод.


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;
    }
}

в этом коде (используя несуществующую технологию кэша для иллюстрации точки) фактический метод вызывается только в том случае, если кэш не возвращает результат. Это точно Весенние Аннотации EHCache проект работает, например.

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