0

モジュールをより適切に分析するために、AspectJ ロギングをモジュールに実装しようとしています。私のアプリケーションはすでに log4J フレームワークを使用しています。
別のアプリケーションで AspectJ クラスを実行すると正常に動作しますが、アプリケーションと統合すると動作しません。ここで私がしたこと
applicationContext.xml

<aop:aspectj-autoproxy/>
<bean id="logAspectj" class="com.test.aspect.LoggingAspect"/>

LoggingAspect クラス

@Component
@Aspect
public class LoggingAspect {

    private final Log log = LogFactory.getLog(this.getClass());

    @Around("execution(public void com.db.TestMarshaller.saveDoc(..))")
    public Object logTimeMethod(ProceedingJoinPoint joinPoint) throws Throwable {

            StopWatch stopWatch = new StopWatch();
            stopWatch.start();

            Object retVal = joinPoint.proceed();

            stopWatch.stop();

            StringBuffer logMessage = new StringBuffer();
            logMessage.append(joinPoint.getTarget().getClass().getName());
            logMessage.append(".");
            log.info(logMessage.toString());
            return retVal;
    }

}

注: ここで、TestMarshaller は Spring 経由で公開されません。

Log4j 用の特定の AspectJ 設定はありますか?

4

1 に答える 1

1

com.db.TestMarshaller は「Spring Managed」ではないため (コンテキストにそのタイプの Spring Bean がありません)、使用される Spring 名前空間はアスペクトを呼び出すプロキシを作成しません。

この場合、AspectJ Compiler を使用してソースをコンパイルするか (Compile Time Weaving)、クラスのロード時に aspectj ランタイムを使用してバイトコードを変更する必要があります (Load Time Weaving)。

どちらに進むかはユースケースによって異なります。アスペクトがビジネス ロジックの一部であり、実行時に変更できない場合は、一度しか実行されないため、aspectj コンパイラを使用してください。アスペクトのより動的なアプリケーションが必要な場合は、代わりに読み込み時間の織り方を使用してください。

これが役に立てば幸いです、ヨッヘン

于 2012-08-17T10:53:08.177 に答える