在springboot项目中,往往需要在用户完成某些操作(例如:增,删,改)时,能够将相关操作信息记录下来,形成一个操作日志。
操作日志信息包含:
操作人、操作时间、执行方法的全类名、执行方法名、方法运行时参数、返回值、方法执行时长
所记录的日志信息包括当前接口的操作人是谁操作的,什么时间点操作的,以及访问的是哪个类当中的哪个方法,在访问这个方法的时候传入进来的参数是什么,访问这个方法最终拿到的返回值是什么,以及整个接口方法的运行时长是多长时间。
接下来将介绍如何利用AOP来实现操作日志的生成。
- AOP英文全称:Aspect Oriented Programming(面向切面编程、面向方面编程),其实说白了,面向切面编程就是面向特定方法编程。
AOP的作用:在程序运行期间在不修改源代码的基础上对已有方法进行增强(无侵入性: 解耦)
比如说,我们要想完成统计各个业务方法执行耗时的需求,我们只需要定义一个模板方法,将记录方法执行耗时这一部分公共的逻辑代码,定义在模板方法当中,在这个方法开始运行之前,来记录这个方法运行的开始时间,在方法结束运行的时候,再来记录方法运行的结束时间,中间就来运行原始的业务方法,最后用结束时间减去开始时间即是执行这个方法所消耗的时间。
下面介绍一下AOP的几个核心概念:
1. 连接点:JoinPoint,可以被AOP控制的方法(暗含方法执行时的相关信息)
连接点指的是可以被aop控制的方法。例如:入门程序当中所有的业务方法都是可以被aop控制的方法。
在SpringAOP提供的JoinPoint当中,封装了连接点方法在执行时的相关信息。
例:
2. 通知:Advice,指哪些重复的逻辑,也就是共性功能(最终体现为一个方法)
但是在AOP面向切面编程当中,我们只需要将这部分重复的代码逻辑抽取出来单独定义。抽取出来的这一部分重复的逻辑,也就是共性的功能。
Spring中AOP的通知类型:
- @Around:环绕通知,此注解标注的通知方法在目标方法前、后都被执行
- @Before:前置通知,此注解标注的通知方法在目标方法前被执行
- @After :后置通知,此注解标注的通知方法在目标方法后被执行,无论是否有异常都会执行
- @AfterReturning : 返回后通知,此注解标注的通知方法在目标方法后被执行,有异常不会执行
- @AfterThrowing : 异常后通知,此注解标注的通知方法发生异常后执行
注:只有@Around类型的通知需要用joinPoint.proceed();方法来调用连接点方法,且返回类型为Object
3. 切入点:PointCut,匹配连接点的条件,通知仅会在切入点方法执行时被应用
在通知当中,我们所定义的共性功能到底要应用在哪些方法上?此时就涉及到了切入点pointcut概念。切入点指的是匹配连接点的条件。通知仅会在切入点方法运行时才会被应用。
在aop的开发当中,我们通常会通过一个切入点表达式来描述切入点:
execution
execution主要根据方法的返回值、包名、类名、方法名、方法参数等信息来匹配,语法为:
excution切入点表达式的语法规则:
- 方法的访问修饰符可以省略
- 返回值可以使用号代替(任意返回值类型)
- 包名可以使用号代替,代表任意包(一层包使用一个)
- 使用配置包名,标识此包以及此包下的所有子包
- 类名可以使用号代替,标识任意类
- 方法名可以使用号代替,表示任意方法
- 可以使用 配置参数,一个任意类型的参数
- 可以使用 配置参数,任意个任意类型的参数
- 根据业务需要,可以使用 且(&&)、或(||)、非(!) 来组合比较复杂的切入点表达式。
@annotation
如果我们要匹配多个无规则的方法,比如:list()和 delete()这两个方法。这个时候我们基于execution这种切入点表达式来描述就不是很方便了。而在之前我们是将两个切入点表达式组合在了一起完成的需求,这个是比较繁琐的。
我们可以借助于另一种切入点表达式annotation来描述这一类的切入点,从而来简化切入点表达式的书写。
实现步骤:
- 编写自定义注解
- 在业务类要做为连接点的方法上添加自定义注解
创建自定义注解
例:
在通知方法注解中用@annotation(注解全类名)声明这个通知方法的作用注解
例:
最后在需要做为连接点的方法上添加自定义注解即可。
4. 切面:Aspect,描述通知与切入点的对应关系(通知+切入点)
当通知和切入点结合在一起,就形成了一个切面。通过切面就能够描述当前aop程序需要针对于哪个原始方法,在什么时候执行什么样的操作。
切面所在的类,我们一般称为切面类(被@Aspect注解标识的类)
(注:切面类还需要加上@Component注解)
5. 目标对象:Target,通知所应用的对象
目标对象指的就是通知所应用的对象,我们就称之为目标对象。
首先需要导入AOP依赖
pom.xml
然后需要创建日志记录数据库和实体类还有在Mapper层实现插入数据方法
实体类
Mapper接口
因为我们要记录的操作日志是对于数据的增,删,改所以采用@annotation来指定要为连接点的方法。
而且在涉及到消耗时间的字段,所以需要采用@Around通知类型
自定义注解类
切面类
以上就是对于Spring项目中AOP的使用介绍,并且基于AOP实现了操作日志记录的功能,希望本文能给大家带来帮助。
到此这篇spring aop实现日志记录(springboot aop日志记录)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/rfx/68000.html