创建注解
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface TestAnnotation {
}
详解
- @Target :注解是使用位置,作用到方法上,类…
- @Retention :注解的生命周期,具体在什么阶段执行
- @Inherited :表示该注解会被子类继承
- @Documented :注解信息会被添加到Java文档中
创建注解拦截
@Component
@Aspect
public class TestAnnotationAspect {
protected final Log log = LogFactory.getLog(this.getClass());
@Before("@annotation(logger)")
public void before(JoinPoint joinPoint, TestAnnotation logger) {
log.info("测试注解,方法开始");
}
@After("@annotation(logger)")
public void after(JoinPoint joinPoint, TestAnnotation logger) {
log.info("测试注解,方法结束");
}
@Around("@annotation(logger)")
public Object around(ProceedingJoinPoint joinPoint, TestAnnotation logger) throws Throwable{
log.info("测试注解,方法开始结束1");
Object proceed = joinPoint.proceed();
log.info("测试注解,方法开始结束2");
return proceed;
}
}
详解
- @Component :自动装载该对象
- @Aspect :切面,可以拦截对应的注解
- @Before :前置通知, 在方法执行之前执行
- @After :后置通知, 在方法执行之后执行 。
- @Around :环绕通知, 围绕着方法执行
使用注解
@RestController
public class TestController {
protected final Log log = LogFactory.getLog(this.getClass());
@ApiOperation(value = "测试接口")
@PostMapping(value = "test/annotation")
@TestAnnotation
public String annotation(@RequestBody ReqQueryVO vo){
log.info("测试接口执行中: " + JSON.toJSONString(vo));
return "你好";
}
}
输出结果
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5bf51cfebd6208f3b0246f98935b7f8b.png)