当前位置: 首页 > news >正文

使用Spring Boot AOP实现日志记录

目录

介绍

1.1 什么是AOP

1.2 AOP体系与概念

AOP简单实现

2.1 新建一个SpringBoot项目,无需选择依赖

2.2 设置好本地Maven配置后,在pom.xml文件里添加添加maven依赖

2.3 创建一个业务类接口

2.4 在实体类实现接口业务 

2.5 在单元测试运行结果

2.6 创建切面类

2.7 再次运行测试

 总结


介绍

1.1 什么是AOP

        AOP(Aspect Oriented Programming),面向切面思想,是Spring的三大核心思想之一(两外两个:IOC-控制反转、DI-依赖注入)。

        那么AOP为何那么重要呢?

        在我们的程序中,经常存在一些系统性的需求,比如权限校验、日志记录、统计等,这些代码会散落穿插在各个业务逻辑中,例如下面这个示意图:

31a4a7bec4ed3150224d48c74fd0f2bc.png

 

        有多少业务操作,就要写多少重复的校验和日志记录代码,这显然是无法接受的。当然,用面向对象的思想,我们可以把这些重复的代码抽离出来,写成公共方法,就是下面这样:

70f0688aa25cdbe8586e9cf3e665edf1.png

 

        这样,代码冗余和可维护性的问题得到了解决,但每个业务方法中依然要依次手动调用这些公共方法,也是略显繁琐。有没有更好的方式呢?有的,为了解决这个问题,面向切面编程(AOP)应运而生。AOP将权限校验、日志记录等非业务代码完全提取出来,与业务代码分离,并寻找节点切入业务代码中:

239887065c6ce41b2abbed9e9b05901a.png

 

      AOP通过预编译方式和运行动态代理实现程序功能的统一维护,AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生泛型。利用AOP可以对业务逻辑的各部分进行隔离,是开发人员在编写业务逻辑时,专注核心业务,从而降低业务逻辑各模块之间的耦合度,提高代码重用和开发效率。  

        AOP使用横向抽取机制,取代纵向集成体系的重复代码建设。使用Aspect,使业务逻辑只关注业务本身,将日志管理、事务处理、性能统计、异常处理、权限控制等代码从业务逻辑代码中抽离,从而实现改变这些行为的时候不影响业务逻辑代码。

1.2 AOP体系与概念


Spring AOP和AspectJ

        目前流行的AOP框架分别为Spring AOP和AspectJ。

AOP相关术语


简单地去理解,其实AOP要做三类事:

  • 在哪里切入,也就是权限校验等非业务操作在哪些业务代码中执行。

  • 在什么时候切入,是业务代码执行前还是执行后。

  • 切入后做什么事,比如做权限校验、日志记录等。

因此,AOP的体系可以梳理为下图:

b2d561096aca93133f405e98db521bf7.png

 

AOP简单实现

        下面我们通过一个简单的案例来演示一下AOP的初级应用:

2.1 新建一个SpringBoot项目,无需选择依赖

2.2 设置好本地Maven配置后,在pom.xml文件里添加添加maven依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2.3 创建一个业务类接口

         如图,建立对应的软件包和接口,并在接口创建方法:

2.4 在实体类实现接口业务 

        注意,一定要添加Service注解 

2.5 在单元测试运行结果

2.6 创建切面类

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.StringJoiner;@Component
@Aspect
public class LogAspect {@Before("execution(* com.example.aopdemo.service..*.*(..))")public void sysLog(JoinPoint jp){StringJoiner log = new StringJoiner("|","{","}");DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyy-MM-dd HH:mm:ss");log.add(formatter.format(LocalDateTime.now()));//当前执行的业务方法名称String methodName = jp.getSignature().getName();log.add(methodName);//方法的参数Object[] args = jp.getArgs();for(Object arg:args){log.add(arg == null ? "-" : arg.toString() );}System.out.println("AOP日志启动!" + log);}

2.7 再次运行测试

        再次运行就发发现我们的日志已经添加进去了,并且没有对原代码进行改变,这就是AOP的丝滑之处。

 总结

        AOP使用横向抽取机制,取代纵向集成体系的重复代码建设。使用Aspect,使业务逻辑只关注业务本身,将日志管理、事务处理、性能统计、异常处理、权限控制等代码从业务逻辑代码中抽离,从而实现改变这些行为的时候不影响业务逻辑代码。实乃开发必备之神器也,本文到此就结束了,希望大家可以有所收获~

http://www.lryc.cn/news/102682.html

相关文章:

  • 图像中不规则物体的长轴与短轴:OpenCV实现指南
  • C/C++开发,opencv与qt结合播放视频
  • 磁共振图像处理中 fft1c 和 ifft1c 函数的 Python 实现
  • 阿里云国际站香港地域服务器访问延迟丢包的原因及解决方法
  • GULI PART.1
  • NetApp FAS2750 和 FAS2820:适用于分布式企业和从远程到核心的 FAS
  • 剑指YOLOv8改进最新MPDIoU损失函数:超越现有多种G/D/C/EIoU,23年7月首发论文,高效准确的边界框回归的损失
  • SQL-每日一题【1070. 产品销售分析 III】
  • 为何押注AI大模型的微软云,业绩增速反而不如谷歌云?
  • CDN加速服务的工作原理
  • 在CSDN学Golang云原生(Kubernetes Service)
  • 【数据结构篇C++实现】- 图
  • Sentinel持久化规则
  • list与sort()
  • 6个月、21天,GoldenDB分布式数据库核心系统落地中移动
  • 如何正确培养数据思维?
  • JavaScript中的?.和??的用法
  • Git for linux
  • uniapp小程序,根据小程序的环境版本,控制的显页面功能按钮的示隐藏
  • kotlin 编写一个简单的天气预报app(二)增加搜索城市功能
  • 【分布鲁棒、状态估计】分布式鲁棒优化电力系统状态估计研究[几种算法进行比较](Matlab代码实现)
  • vue中的require
  • Linux进程间共享内存通信时如何同步?(附源码)
  • spring注解驱动开发(二)
  • 【C++】——类和对象
  • 【Docker】使用docker-maven-plugin插件构建发布推镜像到私有仓库
  • 区块链学习笔记
  • 实用上位机--QT
  • os.signal golang中的信号处理
  • Python源码:Tkinter组件布局管理的3种方式