20

次のようなメソッドがあるとします。

public void method(@CustomAnnotation("value") String argument)

@CustomAnnotation で注釈が付けられた引数を持つすべてのメソッドを選択できるポイントカット式はありますか? もしそうなら、「値」引数にアクセスする方法はありますか?

4

5 に答える 5

25

引数の選択について:

@Before("execution(* *(@CustomAnnotation (*)))")
public void advice() {
System.out.println("hello");
}

参照: http://forum.springsource.org/archive/index.php/t-61308.html

注釈パラメーターの取得時:

MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
Annotation[][] methodAnnotations = method.getParameterAnnotations();

反復して instanceof を使用してバインドされた注釈を見つけることができる注釈を取得します。私はそれがハックであることを知っていますが、これが現在サポートされている唯一の方法です。

于 2012-04-24T11:07:04.520 に答える
-1

春のドキュメントから:

@Before("@annotation(myAnnotation)")
public void audit(Auditable myAnnotation) {
  AuditCode code = auditable.value();
  // ...
}

メソッドの署名を操作する必要なく、これは私にとってはうまくいきます。

注: 名前付きポイントカットを使用している場合は、ポイントカット名がオーバーロードされる可能性があるため、一致する (パラメーター名と順序) シグネチャを提供する必要があります。

@Before("goodAdvise(myAnnotation)")
public void audit(Auditable myAnnotation) {
  String value = auditable.value();
  // ...
}

@Pointcut("@annotation(myAnnotation)")
public void goodAdvise(Auditable myAnnotation) { 
  //empty
}
于 2013-03-12T14:15:06.503 に答える