前面针对AOP的使用姿势和一些疑问进行了说明,这一篇则从应用的角度出发,看下AOP可以实现些什么样的效果
I. AOP实现日志拦截
1. 背景及目标
对于后端服务而言,一个日常的需求就是需要记录一些关键方法调用历史情况,用于分析接口的响应、问题定位排查等,属于比较常见的场景了
因此,我们希望可以针对某些接口,知道传入的参数时什么,谁调用的,返回了啥,耗时多少这些基本信息。显然这些属于公用的普适性需求,与方法本身的业务无关,如果直接在每个方法内部中加这个逻辑,就比较恶心了;为了最少的倾入性和通用性,正好可以使用AOP来实现这么一个功能
- 拦截目标方法的执行
- 打印请求参数,返回结果和执行时间到日志
2. 实现
这个属于比较aop的简单使用场景,因为需要知道返回结果,所有选择 around
或者 afterReturning
advice;此外需要统计方法执行耗时,这样就只能选中 around
了
首先我们支持自定义注解方式,先定义一个注解,只要这个方法上有这个注解,就拦截
1 | (ElementType.METHOD) |
其次,如果想更通用拦截指定包路径下的方法,可以如下定义PointCut;注意下面语句中的||
表示或,只有有一个满足即可
1 | "execution(public * com.git.hui.boot.aop.demo.*.*(..)) || @annotation(AnoDot)") ( |
接着就是我们的advice实现了
1 | "pointcut()") (value = |
3. 测试
添加下测试代码,我们先创建两个bean
1 | // 这个bean下的方法,演示注解拦截 |
启动类如下
1 |
|
输出结果
1 | com.git.hui.boot.aop.demo.PrintDemo|genRand|10,"--一灰灰Blog"|"10521195c0-3c2a-41d0-82f5-a41afad066b0--一灰灰Blog"|240 |
II. 其他
0. 项目
- 工程:spring-boot-demo
- 项目: https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-boot/011-aop-logaspect
1. 一灰灰Blog
- 一灰灰Blog个人博客 https://blog.hhui.top
- 一灰灰Blog-Spring专题博客 http://spring.hhui.top
一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明
尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
- 微博地址: 小灰灰Blog
- QQ: 一灰灰/3302797840
3. 扫描关注
一灰灰blog
知识星球
Be the first person to leave a comment!