使用Spring和AspectJ在类上定位基于方面的注释

时间:2012-05-11 10:54:01

标签: java spring annotations aspectj aop

如何创建一个方面,该方面针对属于使用特定注释标记的类的所有公共方法?在下面的方法1()方法2()应由方面处理,方法3()不应由方面处理。

@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和基于代理的方面。

3 个答案:

答案 0 :(得分:3)

以下内容应该有效

@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..
}

答案 1 :(得分:1)

使用@target并使用反射读取类型级别注释。

@Around("@target(com.example.SomeAnnotation)")
public Object invokeService(ProceedingJoinPoint pjp) throws Throwable { 

答案 2 :(得分:0)

这在Spring Boot 2中有效:

@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不必是注释的名称。 / p>