我正在尝试为我的项目创建自定义注释。在这里-
数据源选取器(注释(:
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
注释,如下所示 -
数据源选取器方面:
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...
}
}
当我尝试像这样注释我的服务类时,首先设置了这些 -
(好方法(:
@Service
@DataSourcePiceker
public SomeServiceClass{
pubic void method1(){}
pubic int method2(List<Integer> list){}
pubic String method3(String a, String b){}
}
上面的代码(SomeServiceClass
(编译得很好。但是这两种方法都不受我写的方面(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
吗?我只想创建一个注释并用它注释一个类,而该类的所有方法都会受到影响。
提前致谢
使用@annotation(my.fancy.Annotation)
您可以截获带注释的方法,而@within(my.fancy.Annotation)
则与带注释的类匹配,如 Spring 手册中所述。也许你想在使用Spring AOP之前通过反复试验来阅读它。