从Method或Type级别

时间:2016-04-21 17:17:59

标签: java spring annotations spring-aop

我正在使用带有@AspectJ注释样式的Spring AOP。我想获得注释指定的值,可以在方法级别或类级别使用。例如:

我的主要注释,它采用类型为value的{​​{1}}参数:

String

另一个注释,用于在类/类型级别使用@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface MyAnnotation { String value(); } 时忽略MyAnnotation,并且此MyAnnotation出现在方法级别:

IgnoreMyAnnotation

切入点和注释建议:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface IgnoreMyAnnotation {

}

最后,一些MyAnnotation的使用案例......

在班级/类型级别使用:

@Aspect
@Component
public class MyAnnotationAdvice {

    @Pointcut("@annotation(myAnnotation)")
    public void methodHasMyAnnotation(MyAnnotation myAnnotation) {}

    @Pointcut("@within(myAnnotation)")
    public void classHasMyAnnotation(MyAnnotation myAnnotation) {}  

    @Pointcut("@annotation(com.mycompany.aop.IgnoreMyAnnotation)")
    public void methodIgnoresMyAnnotation() {}

    @Pointcut("methodHasMyAnnotation(myAnnotation) || (classHasMyAnnotation(myAnnotation) && !methodIgnoresMyAnnotation())")
    public void caresAboutMyAnnotation(MyAnnotation myAnnotation) {}

    @Before("caresAboutMyAnnotation(myAnnotation)")
    public void doSomethingWithAnnotationValue(JoinPoint jp, MyAnnotation myAnnotation) {

        /*
           when annotated at the class level, myAnnotation
           is defined and has expected value... but when
           annotated at the method level, myAnnotation is null!
        */
        String annotationValue = myAnnotation.value();

        // do something with annotationValue...

    }
}

在方法级别使用:

@Service
@MyAnnotation("I can get this value no problem!")
public class MyServiceAImpl implements MyServiceA {

    public void doSomething() { /* ... */ }

    @IgnoreMyAnnotation
    public void doSomethingElse() { /* ... */ }

}

0 个答案:

没有答案