選択したメソッドをプロファイルするAspectJの使用を
質問
私は、ライブラリをプロファイルするためにAspectJのを使用したいと思います。私の計画は、アノテーションでプロファイリングを必要とするメソッドをマークしました。
@Profiled("logicalUnitOfWork")
そして、プロファイルさコンテンツを強調するためにlogicalUnitOfWork
を使用する方法の前と後に解雇でしょう側面を持っています。
だから、私のポイントカットはこのようなルックスで開始します。私はここに注釈の引数を持っていないことに注意してください。それは私が動くかどうかはわかりませんものの一つです。
pointcut profiled() : execution(@Profiled * *());
before() : profiled () {
// : the profiled logical name is in this variable:
String logicalEventType;
Profiler.startEvent (logicalEventType);
}
after() returning : profiled() {
// : the profiled logical name is in this variable:
String logicalEventType;
Profiler.endEvent (logicalEventType);
}
プロファイルされた方法は、次のように定義されます。
@Profiled("someAction")
public void doAction (args...) {}
要するに、どのように私は縦横に@Profiled
注釈の値を得ることができますか?私はちょうどそれがアドバイスに見えるようにする必要がある、値に基づいて発生したプロファイリング制限する必要はありません。また、私は仕事には、このためのランタイムに設定注釈の保持力を持っている必要がありますか、または私の代わりにクラスレベルの保持を持つことができますか?
解決
私は、これはそれを行うための最善の方法であるかどうかわからないけど、あなたのような何かを試すことができます:
pointcut profiledOperation(Profiled p) :
execution(@Profiled * *()) && @annotation(p);
before(Profiled p): profiledOperation(p)
{
System.out.println("Before " + p.value());
}
after(Profiled p): profiledOperation(p)
{
System.out.println("After " + p.value());
}
あなたは、実行時に注釈値にアクセスする必要があるので、あなたは@Retention
にRUNTIME
を設定する必要があります。
他のヒント
私は、「デフォルト値」のフィールドに注釈を付けるためにしばらく前に似た何かをしました。私は見つける仕事shoud注釈が付け方法、に適合するようにしようとしました。私は簡潔のためにそれを残してきたので、あなたは、もちろん、ここでエラーチェックとヌル・テストのビットを追加する必要があります。
ジョインポイントの静的な部分を使用して、注釈の値を取得することができます。
private String getOperationName(final JoinPoint joinPoint) {
MethodSignature methodSig = (MethodSignature) joinPoint
.getStaticPart()
.getSignature();
Method method = methodSig.getMethod();
Profiled annotation = method.getAnnotation(Profiled.class);
return annotation.value();
}
あまりにも多くの反射を避けるために、それは代わりにaround
アドバイスを使用するように、おそらく良い考えです。
around(): profiled() {
String opName = getOperationName(thisJoinPoint);
Profiler.startEvent(opName);
proceed();
Profiler.endEvent(opName);
}