Joinpoint
とProceedingjoinpoint
の違いは何ですか?
アスペクトクラスのメソッドでJoinpoint
およびProceedingjoinpoint
を使用する場合
私はAspectJクラスでJoinPoint
を次のように使用しました:
@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? Also what will
pjp.proceed() `してくれますか?
_@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()
メソッドを呼び出します。
アラウンドアドバイスは、メソッド(または他の結合ポイント)をいつ実行するかを制御できる特別なアドバイスです。これはアラウンドアドバイスにのみ当てはまるため、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つの特徴は、戻り値が必要であるのに対し、他のアドバイスタイプには戻り値が含まれていてはならないことです。