web-dev-qa-db-ja.com

アスペクトJを使用してAOPのジョインポイントVS ProceedingJoinPoint?

JoinpointProceedingjoinpointの違いは何ですか?

アスペクトクラスのメソッドで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 willpjp.proceed() `してくれますか?

18
Human Being
_@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()メソッドを呼び出します。

9

アラウンドアドバイスは、メソッド(または他の結合ポイント)をいつ実行するかを制御できる特別なアドバイスです。これはアラウンドアドバイスにのみ当てはまるため、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つの特徴は、戻り値が必要であるのに対し、他のアドバイスタイプには戻り値が含まれていてはならないことです。

25