0

私はAOP、特にSpringAOPの初心者です。

特定の方法で実行時間を記録したい。Springのドキュメントを読み、アノテーションポイントカットを使用してアスペクトを作成するのが最善の解決策であると考えました。

次のようになります。

@Around("@annotation(com.x.y.MethodExecutionTime)")
public Object methodExecutionTimeLog(ProceedingJoinPoint joinPoint) throws Throwable 
    StopWatch stopWatch = new StopWatch();

    Object retVal = null;
    try {
        stopWatch.start();
        retVal = joinPoint.proceed();
        stopWatch.stop();
        logger.info("Execution time: " + stopWatch.getTotalTimeMillis() + " ms");
    } catch(Throwable e) {
        logger.error("Execution time: " + stopWatch.getTotalTimeMillis() + " ms");
        throw e;
    }
    return retVal;
}

メソッドで注釈が使用されます:

    @Override
@MethodExecutionTime
public <T> T copy(Class<T> destType) {

    T t = ReflectionHelper.newInstance(destType);

    copyTo(t);

    return t;
}

Spring XML構成:

<context:spring-configured />
<aop:aspectj-autoproxy proxy-target-class="true" />

しかし、それは何も記録しません。

Spring3.0.5を使用しています

何か案は?ありがとう

4

1 に答える 1

1

他のすべてが適切に構成されている場合、それはSpring AOP(少なくともデフォルト構成)の制限の1つである必要があります。

  • アスペクトを適用するオブジェクトは、Springによって管理される必要があります(つまり、で作成されるのではなく、アプリケーションコンテキストから取得される必要がありますnew

  • 呼び出しは、そのオブジェクトの「外部」から発信する必要があります。つまり、同じオブジェクトの別のメソッドを呼び出す場合、アスペクトは適用されません。

  • <aop:aspectj-autoproxy>アスペクトを適用するオブジェクトと同じアプリケーションコンテキストで宣言する必要があります(特に、一般的なSpring Web MVCアプリケーションで、異なるアプリケーションコンテキストapplicationContext.xmlを形成します)。...-servlet.xml

于 2012-06-18T16:11:35.267 に答える