2

私はプロファイリング方法を作成しました:

@Around("tld.mycompany.business.aspects.SystemArchitecture.inServiceLayer() && !tld.mycompany.business.aspects.SystemArchitecture.publicConstructor()")
public Object profileBusiness(ProceedingJoinPoint pjp) throws Throwable {
 try {
    long start = System.currentTimeMillis();
    String name = pjp.getSourceLocation().toString() + " " + pjp.getSignature().getName();
    Object output = pjp.proceed();
    long elapsedTime = System.currentTimeMillis() - start;
    if(elapsedTime > 100)
        System.err.println("TimerAspect: Businessmethod " + name + " execution time: " + elapsedTime + " ms.");

    return output;
 } catch (Exception ex) {
     ex.printStackTrace(System.err);
     throw ex;
 }
}

そして、tld.mycompany.business.aspects.SystemArchitectureのポイントカットを次のように定義しました

@Pointcut("execution(public new(..))")
public void publicConstructor() {}

@Pointcut("within(tld.mycompany.business..*Impl) && 
           !execution(private * tld.mycompany.business.*.dataType()) && 
           !handler(java.lang.Exception)")

public void inServiceLayer() {}

コンストラクターと例外ではないサービスレイヤー内のすべてのメソッドをプロファイリングしたい(「初期化がサポートされていない(コンパイラーの制限)」と「初期化前がサポートされていない(コンパイラーの制限)」を取得しないようにする「警告)そして私がいくつか持っているdataType()を無視してください。

ただし、コンストラクターと例外に関する警告が表示されます。また、Javaメソッドについてアドバイスしているようです。そのため、すべての行で多くのアドバイスをヒットするため、アプリケーションのデバッグはほぼ不可能になりました。Eclipseは、profileBusinessラインだけで2747のアドバイスがあると言っています。

明らかに私は何かを誤解したに違いありませんが、何ですか?Implで終わるtld.mycompany.business階層内のクラスのすべてのメソッド(コンストラクターを除く)の周りにあるようにするにはどうすればよいですか?

乾杯

ニック

4

1 に答える 1

4

ポイントカットのこの部分:

within(tld.mycompany.business..*Impl)

すべてのクラスのすべての参加ポイントを対象とします*Impl。そのため、すべての行にアドバイスマーカーが表示されます。

次のような行を追加する必要があります。

execution(* tld.mycompany.business..*Impl.*(..))

また、!handler(java.lang.Exception)ハンドラーポイントカットはcatch句(実行ポイントカットを除く)を参照するため、意味がありません。

最後に、あなたのpublicConstructorポイントカットは私には間違っているようです。保護された、プライベートな、パッケージで保護されたコンストラクターも削除しませんか?

于 2010-09-09T19:50:18.513 に答える