直接贴入代码 ,注释写的很清楚
- 此处为controller层 方法上加上自定义的切面注解
入参实体
public class TestM extends BaseModel{
/**
*
*/
private static final long serialVersionUID = 1L;
private String a;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
}
@RefreshScope
@RestController
@RequestMapping("/c001")
public class Mytestas extends BaseController{
@RequestMapping("/f01")
@ItestAspect(v = "AA")
public void aaa(@RequestBody TestM t){
String a = t.getA();
System.out.println(a);
}
}
下方为自定义切面类
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ItestAspect {
String v();
}
注解说明
RetentionPolicy.RUNTIME —— 这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用
Documented 注解表明这个注解应该被 javadoc工具记录. 默认情况下,javadoc是不包括注解的. 但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工具处理, 所以注解类型信息也会被包括在生成的文档中
@Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标
@Aspect
@Component
public class MytestAspect {
@Pointcut("@annotation(itestAspect)")
public void riskPointcut(ItestAspect itestAspect) {
}
@Before(value="riskPointcut(itestAspect)",argNames="joinPoint,itestAspect")
public void a(JoinPoint joinPoint,ItestAspect itestAspect){
String v = itestAspect.v();
String c="";
if (("AA").equals(v)) {
Object[] args = joinPoint.getArgs();
TestM object = (TestM) args[0];
c =object.getA()+v;
object.setA(c);
}
}
}
@Pointcut("@annotation(itestAspect)")
拦截 带有itestAspect注解的方法
@Before(value=“riskPointcut(itestAspect)”,argNames=“joinPoint,itestAspect”)
前置任务 riskPointcut(itestAspect) 指的是拦截方法所拦截到的参数
JoinPoint 指的是 所拦截方法上的参数 第一个参数为joinPoint.getArgs()[0] , 从0开始依次类推
ItestAspect 指的是自定义切面注解上所附带的参数
postman 入参
postman请求后
后台打印为BBAA
说明切面类执行成功