3

特定のアノテーションでマークされたクラスに属するすべてのパブリックメソッドを対象とするアスペクトを作成するにはどうすればよいですか?以下では、 method1()およびmethod2()はアスペクトによって処理されるべきであり、method3()はアスペクトによって処理されるべきではありません。

@SomeAnnotation(SomeParam.class)
public class FooServiceImpl extends FooService {
    public void method1() { ... }
    public void method2() { ... }
}

public class BarServiceImpl extends BarService {
    public void method3() { ... }
}

メソッドレベルでアノテーションを付けると、この側面は機能し、メソッド呼び出しと一致します。

@Around("@annotation(someAnnotation)")
public Object invokeService(ProceedingJoinPoint pjp, SomeAnnotation someAnnotation) 
 throws Throwable { 
   // need to have access to someAnnotation's parameters.
   someAnnotation.value(); 

}

私はSpringとプロキシベースの側面を使用しています。

4

3 に答える 3

5

以下が機能するはずです

@Pointcut("@target(someAnnotation)")
public void targetsSomeAnnotation(@SuppressWarnings("unused") SomeAnnotation someAnnotation) {/**/}

@Around("targetsSomeAnnotation(someAnnotation) && execution(* *(..))")
public Object aroundSomeAnnotationMethods(ProceedingJoinPoint joinPoint, SomeAnnotation someAnnotation) throws Throwable {
    ... your implementation..
}
于 2012-05-11T11:18:12.893 に答える
1

@targetを使用し、リフレクションを使用してタイプレベルのアノテーションを読み取ると機能します。

@Around("@target(com.example.SomeAnnotation)")
public Object invokeService(ProceedingJoinPoint pjp) throws Throwable { 
于 2012-05-11T11:17:10.150 に答える
1

これはSpringBoot2で機能します。

@Around("@within(xyz)")
public Object method(ProceedingJoinPoint joinPoint, SomeAnnotation xyz) throws Throwable {
    System.out.println(xyz.value());
    return joinPoint.proceed();
}

メソッドの引数タイプ()に基づいてSomeAnnotation xyz、SpringとAspectJは探しているアノテーションを認識しているため、xyzアノテーションの名前である必要はないことに注意してください。

于 2019-07-19T16:15:53.163 に答える