1

ソースコードを変更できないプロジェクトの一部のパッケージに多くのクラスを記録する必要があります。したがって、パッケージ名を指定できるソリューションが必要です。springaopを使用すると、パッケージのクラスを変更せずにログを追加できますが、どうすればよいかわかりません。どうやってやるの?

4

1 に答える 1

1

Spring AOP では、これらのクラスが Spring Bean として使用されている場合にのみログに記録できます。さらに、パブリック メソッドの実行のみをログに記録できます。

これは、 Spring AOP と AspectJ バイト コード ウィービングの両方で使用できる@AspectJ 通知のアスペクトです (これは、「実際の AspectJ」と Spring AOP の両方と互換性のあるスタイルです。Springリファレンスの違いについて読んでください)。

@Aspect
public class LoggingAspect{

    @Pointcut("execution(* com.mycompany.myproject.*.*(..))")
    public void methodToLog(){
    };

    @Around("methodToLog()")
    public Object logMethod(final ProceedingJoinPoint joinPoint) throws Throwable{
        final StaticPart staticPart = joinPoint.getStaticPart();
        final String sig =
            "" + staticPart.getSignature() + " with args: "
                + Arrays.deepToString(joinPoint.getArgs());
        System.out.println("Entering method " + sig);
        final Object result = joinPoint.proceed();
        System.out.println("Leaving method " + sig);
        return result;
    }

}

以下は、いくつかのメソッドを持つ愚かなクラスです。

package com.mycompany.myproject;
public class Dummy1{

    public static void main(final String[] args){
        final Dummy1 dummy = new Dummy1();
        dummy.doSomeStuff();
        dummy.doSomeStuffWithSomeArgs("Hello", 123);
    }

    private void doSomeStuff(){}

    public void doSomeStuffWithSomeArgs(final String firstArg,
        final int secondArg){}

}

このクラスを Eclipse / AJDT で Java/AspectJ アプリケーションとして開始すると、次の出力が得られます。

Entering method void com.mycompany.myproject.Dummy1.main(String[]) with args: [[]]
Entering method void com.mycompany.myproject.Dummy1.doSomeStuff() with args: []
Leaving method void com.mycompany.myproject.Dummy1.doSomeStuff() with args: []
Entering method void com.mycompany.myproject.Dummy1.doSomeStuffWithSomeArgs(String, int) with args: [Hello, 123]
Leaving method void com.mycompany.myproject.Dummy1.doSomeStuffWithSomeArgs(String, int) with args: [Hello, 123]
Leaving method void com.mycompany.myproject.Dummy1.main(String[]) with args: [[]]

Spring AOP でこれをテストするには、より多くの作業が必要になるため (メイン メソッドのアプローチは機能しません。ApplicationContext を作成し、メソッドを呼び出すタイプ Dummy1 の Bean を登録する必要があります)、そのままにしておきます。しかし、プライベート メソッドの呼び出しはログに記録されないことは確かです。

SpringSource Tool Suiteをダウンロードすると、アスペクトの視覚化とテストのための便利なツールが手に入ります。Spring AOP のみを使用したい場合でも、 AspectJ bookも読む必要があります。それは素晴らしい本です。


ところで: system.out ではなく、実際のロガーを使用したいことは明らかです。アスペクトごとに 1 つ定義するか、または (実際のアスペクトでのみ) ターゲット クラスに静的メンバーとして導入して、クラスごとのログを取得することができます。私の意見では、AspectJ のキラー機能です。

于 2010-08-24T12:34:31.080 に答える