使用 AOP 的注释 - 在方法级别工作,而只有 class 被注释

Annotation with AOP - works at method level while only the class is annotated

我正在尝试为我的项目创建自定义注释。在这里 -

DataSourcePicker(注解):

   import java.lang.annotation.ElementType;
   import java.lang.annotation.Retention;
   import java.lang.annotation.RetentionPolicy;
   import java.lang.annotation.Target;

   @Target({ElementType.METHOD, ElementType.TYPE})
   @Retention(RetentionPolicy.RUNTIME)
       public @interface DataSourcePicker {

   }

我已经像这样使用 AOP 实现了 DataSourcePicker 注释 -

DataSourcePickerAspect:

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class DataSourcePickerAspect implements Ordered {

    private int order;

    @Value("10")
    public void setOrder(int order) {
        this.order = order;
    }

    @Override
    public int getOrder() {
        return order;
    }

    @Pointcut(value="execution(public * *(..))")
    public void anyPublicMethod() { }


    @Around("@annotation(dataSourcePicker)")
    public Object pickDataSource(ProceedingJoinPoint pjp, 
    DataSourcePicker dataSourcePicker) throws Throwable {
        //some code...
    }
}  

当我尝试像这样注释我的服务 class 时,首先要设置这些 -

(好的方法):

   @Service
   @DataSourcePiceker
   public SomeServiceClass{     
       pubic void method1(){}
       pubic int method2(List<Integer> list){}
       pubic String method3(String a, String b){}
   }

以上代码 (SomeServiceClass) 编译正常。但是这两种方法都不受我写的 aspect(DataSourcePicker) 的影响。 但是当我用 DataSourcePicker 注释我的方法时,它按预期工作 - 所有方法都被 DataSourcePickerAspect 拦截 @Around 建议 -

(不太好的方法,我猜):

   @Service
   @DataSourcePiceker
   public SomeServiceClass{
       @DataSourcePiceker     
       pubic void method1(){}

       @DataSourcePiceker
       pubic int method2(List<Integer> list){}

       @DataSourcePiceker
       pubic String method3(String a, String b){}
   }  

有人可以帮助我如何实现 Good Approach 吗?我只想创建一个注释并用它注释 class 而 class 的所有方法都会受到影响。

提前致谢

使用 @annotation(my.fancy.Annotation) 可以拦截带注释的方法,而 @within(my.fancy.Annotation) 匹配带注释的 类,如 Spring manual 中所述。也许您想在通过试验和错误使用 Spring AOP 之前阅读它。