2025年spring aop实现日志记录(springboot aop日志记录)

spring aop实现日志记录(springboot aop日志记录)svg xmlns http www w3 org 2000 svg style display none svg

大家好,我是讯享网,很高兴认识大家。



 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg> 

讯享网


 在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切入点表达式的语法规则:

  1. 方法的访问修饰符可以省略
  2. 返回值可以使用号代替(任意返回值类型)
  3. 包名可以使用号代替,代表任意包(一层包使用一个)
  4. 使用配置包名,标识此包以及此包下的所有子包
  5. 类名可以使用号代替,标识任意类
  6. 方法名可以使用号代替,表示任意方法
  7. 可以使用 配置参数,一个任意类型的参数
  8. 可以使用 配置参数,任意个任意类型的参数
  9. 根据业务需要,可以使用 且(&&)、或(||)、非(!) 来组合比较复杂的切入点表达式。

    @annotation
    ​  如果我们要匹配多个无规则的方法,比如:list()和 delete()这两个方法。这个时候我们基于execution这种切入点表达式来描述就不是很方便了。而在之前我们是将两个切入点表达式组合在了一起完成的需求,这个是比较繁琐的。
    ​  我们可以借助于另一种切入点表达式annotation来描述这一类的切入点,从而来简化切入点表达式的书写。

实现步骤:

  1. 编写自定义注解
  2. 在业务类要做为连接点的方法上添加自定义注解

创建自定义注解
例:

讯享网

在通知方法注解中用@annotation(注解全类名)声明这个通知方法的作用注解
例:

 

最后在需要做为连接点的方法上添加自定义注解即可。
4. 切面:Aspect,描述通知与切入点的对应关系(通知+切入点)

​ ​  当通知和切入点结合在一起,就形成了一个切面。通过切面就能够描述当前aop程序需要针对于哪个原始方法,在什么时候执行什么样的操作。

​ ​  切面所在的类,我们一般称为切面类(被@Aspect注解标识的类)
(注:切面类还需要加上@Component注解)

5. 目标对象:Target,通知所应用的对象

​​  目标对象指的就是通知所应用的对象,我们就称之为目标对象。

首先需要导入AOP依赖
pom.xml

讯享网

然后需要创建日志记录数据库和实体类还有在Mapper层实现插入数据方法
实体类

 

Mapper接口

讯享网

​ 因为我们要记录的操作日志是对于数据的增,删,改所以采用@annotation来指定要为连接点的方法。
​ 而且在涉及到消耗时间的字段,所以需要采用@Around通知类型
自定义注解类

 

切面类

讯享网

 

​  以上就是对于Spring项目中AOP的使用介绍,并且基于AOP实现了操作日志记录的功能,希望本文能给大家带来帮助。

小讯
上一篇 2025-05-26 14:00
下一篇 2025-05-04 11:30

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/190690.html