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 проект работает, например.
другая специальность вокруг советов заключается в том, что они должны иметь возвращаемое значение, в то время как другие типы советов не должны иметь его.