直接贴入代码 ,注释写的很清楚
- 此处为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
说明切面类执行成功