4

Spring Boot如何利用AOP巧妙记录操作日志?

 3 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzU2NDc4MjE2Ng%3D%3D&%3Bmid=2247486252&%3Bidx=1&%3Bsn=5cf32346e7bc4d6a325a4b7fbb2bf96d
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

eUn6fiF.jpg!mobile

本篇要点

简要回顾S pringAOP的相关知识点:关键术语,通知类型,切入点表达式等等。

介绍SpringBoot快速启动测试AOP,巧妙打印日志信息。

简单回顾SpringA OP的相关知识点

SpringAOP的相关的知识点包括源码解析,为了加深印象,这边再做一个简短的回顾:

1、AOP关键术语

ei6Nji6.jpg!mobile

切面(Aspect):也就是我们定义的专注于提供辅助功能的模块,比如安全管理,日志信息等。

连接点(JoinPoint):切面代码可以通过连接点切入到正常业务之中,图中每个方法的每个点都是连接点。

切入点(PointCut):一个切面不需要通知所有的连接点,而在连接点的基础之上增加切入的规则,选择需要增强的点,最终真正通知的点就是切入点。

通知方法(Advice):就是切面需要执行的工作,主要有五种通知:before,after,afterReturning,afterThrowing,around。

织入(Weaving):将切面应用到目标对象并创建代理对象的过程,SpringAOP选择再目标对象的运行期动态创建代理对

引入(introduction):在不修改代码的前提下,引入可以在运行期为类动态地添加方法或字段。

2、通知的五种类型

前置通知Before:目标方法调用之前执行的通知。

后置通知After:目标方法完成之后,无论如何都会执行的通知。

返回通知AfterReturning:目标方法成功之后调用的通知。

异常通知AfterThrowing:目标方法抛出异常之后调用的通知。

环绕通知Around:可以看作前面四种通知的综合。

3、切入点表达式

上面提到:连接点增加切入规则就相当于定义了切入点,当然切入点表达式分为很多种,这里主要学习execution和annotation表达式。

execution

写法:execution(访问修饰符 返回值 包名.包名……类名.方法名(参数列表))

例:execution(public void com.smday.service.impl.AccountServiceImpl.saveAccount())

访问修饰符可以省略,返回值可以使用通配符*匹配。

包名也可以使用*匹配,数量代表包的层级,当前包可以使用..标识,例如* *..AccountServiceImpl.saveAccount()

类名和方法名也都可以使用*匹配:* *..*.*()

参数列表使用..可以标识有无参数均可,且参数可为任意类型。

全通配写法:* *…*.*(…)

通常情况下,切入点应当设置在业务层实现类下的所有方法:* com.smday.service.impl.*.*(..)。

@annotation

匹配连接点被它参数指定的Annotation注解的方法。也就是说,所有被指定注解标注的方法都将匹配。

@annotation(com.hyh.annotation.Log):指定Log注解方法的连接点。

4、AOP应用场景

记录日志

监控性能

权限控制

事务管理

快速开始

引入依赖

如果你使用的是SpringBoot,那么只需要引入:spring-boot-starter-aop,框架已经将spring-aop和aspectjweaver整合进去。

ZjqaumZ.jpg!mobile

定义日志信息封装

yyE3ayj.jpg!mobile

自定义注解@Log

YfeaEjR.jpg!mobile

定义测试接口

VfumUjf.jpg!mobile

定义切面Aspect与切点Pointcut

用@Aspect注解标注标识切面,用@PointCut定义切点。

iqYrymV.jpg!mobile

定义通知方法Advice

这里使用环绕通知,

BvMJVj.jpg!mobile

这里处理webLog的方式有很多种,考虑性能,可以采用异步方式存入数据库,相应代码已经上传至Gitee。

测试

BFNRJby.jpg!mobile

结果如下:

ee2aMzI.jpg!mobile

回复【4001】程序员变量命名神器

yUfmAfJ.png!mobileyUfmAfJ.png!mobile 回复【3001】java开发手册-嵩山版

22e6fqn.png!mobile22e6fqn.png!mobile 回复【01】浏览器PostWoman插件

回复【02】octotree github代码浏览插件

回复【2001】idea Stack Overflow懒人搜索插件


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK