SpringAOP初识——初学者向

article/2025/9/14 7:28:10

Spring中最重要的两个部分

        1.IOC 控制反转
        2.AOP面向切面编程

      博主之前有一篇文章是关于SpringIOC的理解:关于SpringIOC的理解有需要的小伙伴可以自行跳转。
 

      下面,我们今天来一起学习下SpringAOP相关的知识点。SpringAOP的英文全称是——(Aspect-Oriented Programming)面向切片编程,切片的理解大家可以想象一下切片面包,一个面包整体就是我们的项目,而把面包从业务的角度切成一片一片的,这些切片就是我们的业务。我们来举一个例子,比如下面这张图:

        在我们没有使用SpringAOP时,我们想要实现一个电商项目的日志追踪功能,我们需要在我们的每个业务层中都去添加这一功能相关的代码,繁琐而且缠绕,比如登录Service中本来只需要处理登录业务相关的代码逻辑,但是却不得不加入输出打印日志相关的代码。但是使用了AOP面向切面编程之后:

         我们只需要在controller 和 service中间切上那么一刀,把我们的日志追踪功能添加进去,然后通知Spring,并标注切入点。我们就可以实现业务之间的解耦,让每一块单独的业务只关心自己当前模块的相关业务。代码不再缠绕。总结一下:

  • 面向切面的编程(AOP)实现了横切关注的模块化, 横切关注的代码都在一个地方

  • 关注点分离: 如 日志关注点从业务代码中独立出来, 业务模块不用再关心日志问题.

    解决了:

  • 代码缠绕, 关注点耦合

  • 代码分散, 同样的关注分散在各个模块

那么我们如何去使用SpringAOP中的功能呢?

SpringAOP使用步骤
1.导入依赖

我们在maven中导入SpringAOP的相关依赖,
 

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

2.创建切面组件, 封装横切关注点代码

        通过@Aspect注解标注这个是切面组件

3.标注通知 @Before()

        就是通知Spring在什么之前执行以下相关代码,如上代码段中就是告诉Spring,要在personServiceImpl这个业务实现类中的所有方法前执行,如果需要标注具体方法,可以通过@Pointcut统一管理切入点。

4.标注切入点 "bean(personServiceImpl)"

5.在切面中获取用户调用的方法: 连接点(JoinPoint)

@Aspect //表示这就是切面
@Component//组件注解
public class DemoAspect {private static Logger logger LoggerFactory.getLogger(DemoAspect.class);/*** 在 personServiceImpl bean 的方法之前执行 log()* @Before 称为 通知* bean(personServiceImpl) 称为 切入点* JoinPoint: 连接点, 就是当前方法, 连接到的目标方法*/@Before("bean(personServiceImpl)")public void log(JoinPoint joinPoint){// Signature: 签名, 这里是方法签名// 方法签名: 方法名 + 参数列表Signature signature = joinPoint.getSignature();logger.debug("方法前记录下用户行为:{} 时间执行了 {}",LocalDateTime.now(), signature);}}

 

  • 连接点(JoinPoint)

    • 程序执行过程中的一个点,例如方法的调用,或抛出异常
    • 就是 AOP 切面的插入点
  • 切入点 Pointcut

    • 选择一个或多个连接点的表达式, 告诉AOP, 选择那些切入位置.
    • bean(personServiceImpl), 选择personServiceImpl Bean 全部方法
  • Advice 通知

    • 在选择的每个连接点执行的代码
    • 在连接点的执行代码位置:
      • @Before 正在切入点之前执行
      • @After 正在切入点之后, 无论是否有异常都执行
      • @AfterThrowing 正在切入点出现异常以后执行
      • @AfterReturning 正在切入点正在实行结束以后执行
      • @Around 环绕通知
  • 切面 Aspect

    • 一个囊括了切入点和Advice的模块
    • 是一个类, 包含全部的 切入点, 通知等
  • 编织(织入)

    • 将切面与主要代码进行结合的技术, Spring 底层的代码, 采用动态代理技术, 将Aspect嵌入的目标代码

@AfterReturning 中获取返回值

@AfterThrowing中获取异常信息

/*** 获取 切入点方法的返回值*/
@AfterReturning(value = "bean(personServiceImpl)", returning = "result")
public void test2(JoinPoint joinPoint, Object result){Signature signature = joinPoint.getSignature();logger.debug("方法正常结束记录下用户行为:{} 时间执行了 {}, 返回值:{}",LocalDateTime.now(), signature, result);
}/*** 获取 切入点方法发生的异常*/
@AfterThrowing(value = "bean(personServiceImpl)", throwing = "e")
public void test3(JoinPoint joinPoint, Exception e){Signature signature = joinPoint.getSignature();logger.debug("方法异常结束记录下用户行为:{} 时间执行了 {} 异常: {}",LocalDateTime.now(), signature, e.getMessage());
}

@Pointcut 统一管理切入点 
 

  • 使用@Pointcut定义一个切入点表达式, 将切入点表达式绑定到一个 方法名称
  • 其他通知, 只需要绑定方法名称即可
  • 优势: 当切入点表达式复杂时候, 可以统一管理, 避免反复书写
@Aspect //切面组件, 注解, 来自 aspectj
@Component
public class DemoAspect {private static Logger logger = LoggerFactory.getLogger(DemoAspect.class);/***  @Pointcut 统一管理切入点* - 定义一个切入点表达式* - 将切入点表达式绑定到一个 名称(方法名)* - 其他通知, 只需要绑定方法名称即可*/@Pointcut("bean(personServiceImpl)")public void personService(){}/*** 在 personServiceImpl bean 的方法之前执行 log()* @Before 称为 通知* bean(personServiceImpl) 称为 切入点* JoinPoint: 连接点, 就是当前方法, 连接到的目标方法*/@Before("personService()")public void log(JoinPoint joinPoint){// Signature: 签名, 这里是方法签名// 方法签名: 方法名 + 参数列表Signature signature = joinPoint.getSignature();logger.debug("方法前记录下用户行为:{} 时间执行了 {}",LocalDateTime.now(), signature);}@After("personService()")public void test(JoinPoint joinPoint){Signature signature = joinPoint.getSignature();logger.debug("方法后记录下用户行为:{} 时间执行了 {}",LocalDateTime.now(), signature);}/*** 获取 切入点方法的返回值*/@AfterReturning(value = "personService()", returning = "result")public void test2(JoinPoint joinPoint, Object result){Signature signature = joinPoint.getSignature();logger.debug("方法正常结束记录下用户行为:{} 时间执行了 {}, 返回值:{}",LocalDateTime.now(), signature, result);}/*** 获取 切入点方法发生的异常*/@AfterThrowing(value = "personService()", throwing = "e")public void test3(JoinPoint joinPoint, Exception e){Signature signature = joinPoint.getSignature();logger.debug("方法异常结束记录下用户行为:{} 时间执行了 {} 异常: {}",LocalDateTime.now(), signature, e.getMessage());}
}

@Around 环绕通知, 强大的万能通知!

在连接点(JoinPoint)环绕执行

@Around 可以替代: @Before @After 等全部通知

@Around("personService()")
public Object demo(ProceedingJoinPoint joinPoint) throws Throwable{Signature signature = joinPoint.getSignature();logger.debug("在连接点{}之前", signature);Object value = joinPoint.proceed();  //执行目标连接点方法logger.debug("在连接点{}之后", signature);// 狸猫换太子: 替换返回值的演示// Around 通知中, 可以对返回值进行加工处理, 实现丰富的行为// if (value instanceof List){//      value = new ArrayList<>();// }return value;
}

使用注意事项:

  • @Around 的连接点类型 ProceedingJoinPoint, 表示被执行是方法

  • joinPoint.proceed() 表示执行连接点方法

    • 如果不执行, 就意味着连接点方法被放弃! 这种行为可能是一个有害行为

      • 一般都是要执行
    • joinPoint.proceed() 的返回值是连接方法的返回值, 原则上要作为当前方法的返回值

      • 可以在AOP方法中对这个返回值进行加工处理, 不过这个可能是危险行为!
    • joinPoint.proceed() 的异常就是连接点方法执行异常, 如果进行拦截处理, 就意味着影响异常处理流程.

  • @Around 的功能强大, 可以处理返回值, 可以处理异常, 可以在切入点方法前嵌入代码, 可以在切入点方法之后嵌入代码.

  • 请谨慎使用 @Around


http://chatgpt.dhexx.cn/article/UZIRZLS4.shtml

相关文章

SpringAOP超详细教学

SpringAOP 前言 我的这篇AOP博客有大量的图片和例子教会怎么使用AOP配置那里如果没有学习Maven的话也别急 就是使用maven下载了jar包而已了 你完全可以自己手动导入如果你有一些代码比如说 事务 或者 日志等操作 需要大量嵌入你的代码前后的话 那么无疑AOP是最好用的AOP运行流…

SpringAOP介绍与使用

目录 1.Spring 的 AOP 简介1.1 什么是 AOP1.2 AOP 的作用及其优势1.3 AOP 的底层实现1.4 AOP 的动态代理技术1.5 JDK 的动态代理1.6 cglib 的动态代理1.7 AOP 相关概念1.8 AOP 开发明确的事项1)需要编写的内容2&#xff09;AOP 技术实现的内容3&#xff09;AOP 底层使用哪种代理…

SpringAOP详解,使用SpringAop实现统一日志处理,异常处理

阅读本文内容之前需要先了解java动态代理的实现。java动态代理实例 以下内容为本人原创>>>>>>>>>>> Spring AOP的主要概念&#xff1a; 目标代码&#xff08;或称目标方法、被代理类、被代理方法&#xff09;&#xff1a;原本的业务代码。…

SpringAop学习(一)

Aop面向切面编程 AOP是Spring提供的关键特性之一。AOP即面向切面编程&#xff0c;是OOP编程的有效补充。使用AOP技术&#xff0c;可以将一些系统性相关的编程工作&#xff0c;独立提取出来&#xff0c;独立实现&#xff0c;然后通过切面切入进系统。从而避免了在业务逻辑的代码…

【Spring】SpringAOP切面类

切面类是什么 简单的来说&#xff0c;就是动态的在方法的指定位置添加指定的代码。 为什么需要切面类? 在软件开发的过程中&#xff0c;有很多业务&#xff0c;特别是在编写核心业务的时候&#xff0c;往往需要很多其他的辅助业务&#xff0c;比如说身份验证&#xff08;银…

SpringAOP超详解!!!!

文章目录 一、什么是SpringAOP二、SpringAOP的应用场景三、Aop在 Spring 中的作用四、AOP的实现方式1、方式一&#xff1a;使用原生Spring API接口2、方式二&#xff1a;自定义类方式三&#xff1a;注解 一、什么是SpringAOP SpringAOP的全称是&#xff08;Aspect Oriented Pr…

springAOP的原理解析

一、缘起 因为springAOP原理其实是使用jdk动态代理和cglib动态代理&#xff0c; 在深入了解springAOP的原理之前&#xff0c;我们需要先补充一点有关动态代理的相关的知识&#xff0c;然后我们对于springAOP的理解才会更透彻。所谓动态代理技术是程序在动态运行期间动态的增强某…

SpringAOP简单案例

简介 本文是一个老师在学校给学生上课的简单案例&#xff0c;介绍了AOP的五个通知的使用&#xff0c;以及通知的执行顺序。通过自定义注解来充当切入点&#xff0c;获取注解的类型分别对不同的老师做对应的业务处理。代码中的消息响应体&#xff08;Result&#xff09;大家可以…

springAOP面试题

1.什么是SpringAop? 一般称为面向切面编程&#xff0c;用于将那些与业务无关&#xff0c;但却对多个对象产生影响的公共行为和逻辑&#xff0c;抽取并封装为一个可重用的模块&#xff0c;这个模块被命名为“切面”&#xff08;Aspect&#xff09;&#xff0c;减少系统中的重复…

SpringAOP复习

作业1 目录 作业1一.单选题二.填空题三.判断题 一.单选题 1、以下不属于ProxyFactoryBean类中的常用可配置属性的是&#xff08;&#xff09;。 A、target B、proxyInterfaces C、targetClass D、interceptorNames 答案&#xff1a;C ProxyFactoryBean 是FactoryBean 接口的…

04、SpringAOP详解

1、Spring AOP简介 1、什么是AOP 1、定义阐述 AOP的全称是 Aspect Oriented Programming&#xff0c;是面向切面编程的技术&#xff0c;把一个个的横切关注点放到某个模块中去&#xff0c;称之为切面。那么每一个的切面都能影响业务的某一种功能&#xff0c;切面的目的就是功…

SpringAop之joinPoint讲解

一、学习背景 摸鱼的时候继续复刻demo&#xff0c;没错&#xff0c;同之前一篇文章&#xff0c;在写aop时又发现自己对aop只停留在面试阶段&#xff0c;甚至还不如&#xff0c;完全不会实践&#xff0c;所以在此记录复刻aop用到的的一些且自己已经遗忘的知识。 那么复刻的一个…

SpringAOP详细配置与使用

目录 SpringAOP简介 AOP概念 Spring AOP简单流程图 Spring AOP之Annotation 前置通知(Before advice) 返回后通知(After reurning advice) 抛出异常后通知(After throwing advice) 后置通知(After (finally) advice) 环绕通知(Around advice) 引入(Introduction) Sp…

SpringAOP的注解形式

铁子们&#xff0c;快扫码关注啦&#xff01;或 wx搜索&#xff1a;“聊5毛钱的java”&#xff0c;关注可领取博主的Java学习视频资料&#xff0c;保证都是干货 上一篇讲了配置文件形式的SpringAOP&#xff1a;Spring中的AOP以及切入点表达式和各种通知 本篇继续看一下注解形…

Spring AOP超详细解析

AOP - 面向切面编程&#xff08;Aspect Oriented Programming&#xff09; Spring早期版本的核心功能&#xff1a;管理对象生命周期与对象分配。 即Bean本身的管理创建&#xff0c;以及它整个生命周期里跟其他对象相互之间引用装配 为了更好的实现管理和装配&#xff0c;一个…

Spring学习:AOP概述

一、AOP概念 AOP是指面向切面编程&#xff0c;利用 AOP 可以对业务逻辑的各个部分进行隔离&#xff0c;从而使得业务逻辑各部分之间的耦合度降低&#xff0c;提高程序的可重用性&#xff0c;同时提高了开发的效率。 通俗描述&#xff1a;不通过修改源代码方式&#xff0c;在主干…

SpringAOP学习--SpringAOP简介及原理

前文对AOP做了介绍&#xff0c;实际项目中&#xff0c;一般不会直接上手手动实现aop&#xff0c;而是使用一些高级封装的aop实现&#xff0c;如SpringAOP。 Spring是一个广泛应用的框架&#xff0c;SpringAOP则是Spring提供的一个标准易用的aop框架&#xff0c;依托Spring的IOC…

图文详解Spring AOP,你学会了吗?

如果说 IOC 是 Spring 的核心&#xff0c;那么面向切面编程AOP就是 Spring 另外一个最为重要的核心&#xff0c;需要重点掌握mikechen 本篇主要会详解以下六点&#xff1a; 1.AOP的定义 2.AOP的作用 3.AOP的应用场景 4.Spring AOP的术语 AOP核心概念Spring AOP 通知分类S…

Spring AOP全面详解(超级详细)

如果说IOC 是 Spring 的核心&#xff0c;那么面向切面编程AOP就是 Spring 另外一个最为重要的核心mikechen AOP的定义 AOP &#xff08;Aspect Orient Programming&#xff09;,直译过来就是 面向切面编程,AOP 是一种编程思想&#xff0c;是面向对象编程&#xff08;OOP&…

mysql执行SQL脚本

方法一 【Mysql的bin目录】\mysql –u用户名 –p密码 –D数据库<【sql脚本文件路径全名】 示例&#xff1a; 如果mysql配了全局变量&#xff0c;就不需要到Mysql的bin目录下执行&#xff0c;可以在任何地方使用用户名、密码、指定数据库等参数值与参数名不需要隔空格 不…