使用 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 之前阅读它。
我正在尝试为我的项目创建自定义注释。在这里 -
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 之前阅读它。