当我们要使用切面前,就要写好表达式,但是项目一直在做,代码一直在加,那谁能保证后面接收代码的兄弟也正好知道这个test前缀的意义这么重大呢?
如果他非要用hello作为前缀,那么本应该匹配到的接口就匹配不上了,日志也就不能正常打印了。
这时候,自定义注解,就能够很好的解决这个问题。
自定义注解配合AOP新建一个自定义注解
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface DemoAnnotation { }自定义注解的花样也很多,比如可以在注解中声明变量等,但这些不是我们这次讨论的重点。
将该注解添加到Http接口test2方法上
@DemoAnnotation @GetMapping(value = "/test2") public String test2(HttpServletRequest request, String var1, String var2) { // LOG.info("============打印日志开始============"); // LOG.info("URL: " + request.getRequestURL().toString()); // LOG.info("============打印日志结束============"); // int i = 1/0; if (1<2) throw new IllegalArgumentException("exception"); return "test2"; }在切面类中将切入点的表达式改为
@Pointcut("execution(public * com.jackie.springbootdemo.controller.*.*(..)) && @annotation(com.jackie.springbootdemo.annotation.DemoAnnotation)") public void addAdvice(){}这样,我们不需要限制在controller类中是以test作为前缀了,只要是在上面定义的类路径下,并且扫描到注解DemoAnnotation就可以让切面生效。
从结果可以看出,访问:8080/test1?var1=1并没有经过切面处理,因为不满足切入点中的表达式要求。
这样做的好处在于,控制的粒度更细,也更加灵活,方便切面功能的实现和细分。
代码已提交至rome
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!如果您想持续关注我的文章,请扫描二维码,关注JackieZheng的微信公众号,我会将我的文章推送给您,并和您一起分享我日常阅读过的优质文章。