任何人都可以告诉我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()
会为我们做些什么?
答案 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