23

Joinpointと の違いは何Proceedingjoinpointですか?

アスペクトクラスのメソッドでJoinpointいつ使用するのですか?Proceedingjoinpoint

JoinPointAspectJ クラスで次のように使用しました。

@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();
    }
} 

ここで、「JointPoint pjp.proceed() ProceedingJoinPoint」と比較して何が違うのでしょうか?? Also what will

4

3 に答える 3

33

回避アドバイスは、メソッド (または他のジョインポイント) を実行するタイミングと実行するかどうかを制御できる特別なアドバイスです。これは around アドバイスのみに当てはまるため、 type の引数が必要ですが、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 つの特殊性は、戻り値が必要であるということです。一方、他の種類のアドバイスには戻り値があってはなりません。

于 2013-04-03T09:39:18.297 に答える
12
@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()

于 2013-04-03T08:35:34.690 に答える