3

如何创建一个面向所有公共方法的方面,这些公共方法属于标有特定注释的类?在下面的方法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 和基于代理的方面。

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

这适用于 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不必是注解的名称。

于 2019-07-19T16:15:53.163 回答