SpringAOP超详细教学

article/2025/9/14 7:26:27

SpringAOP


前言

  • 我的这篇AOP博客有大量的图片和例子教会怎么使用AOP
  • 配置那里如果没有学习Maven的话也别急 就是使用maven下载了jar包而已了 你完全可以自己手动导入
  • 如果你有一些代码比如说 事务 或者 日志等操作 需要大量嵌入你的代码前后的话 那么无疑AOP是最好用的
  • AOP运行流程 : 首先调用前置通知(你可以认为最一开始初始的东西)->你的逻辑代码(这里先不说环绕通知)->你的代码有两种情况有可能正常返回, 有可能抛出异常
  • 正常返回调用返回通知
  • 抛出异常调用异常通知
  • 最后一定会调用后置通知(你可以当做是try-catch的finally里的代码这里执行顺序里面有点问题 到时候可以看注意事项)
  • 这里就是给你大致的一个了解没看懂也没事

文章目录

  • SpringAOP
    • 前言
        • AOP实现方式
        • AOP几个相关概念
      • 切面
      • 连接点
      • 建议/通知
      • 切入点(核心)
      • 织入
      • 建议类型
    • 注意事项(重要)
    • 例子及知识点
      • XML版本
        • 配置工作
        • 例子:入门例子前置通知
        • 例子:通过返回通知获取结果
        • 例子:异常通知
        • 例子:环绕通知
        • 例子:带处理过程入参的环绕通知
      • 注解版本
      • 多个切面问题
      • 总结AOP的几种通知

Alt text

AOP实现方式

Alt text

AOP几个相关概念

Alt text
Alt text

Alt text
Alt text

切面

  • 就相当于一个代码插入到一个环境里 常用的方法是使用模版方法模式实现
  • 或者使用**@Aspect**注解

连接点

  • 在Spring里体现为方法

建议/通知

  • 某个切面在特定的连接点加一些东西. 许多AOP框架(包括Spring) 将建议建模为拦截器.
  • 在连接点周围维护一系列拦截器

切入点(核心)

  • 匹配连接点的谓词,
  • Spring默认使用AspectJ切入点表达式语言

织入

  • 把特有的代码逻辑织入原有的代码逻辑

建议类型

  • 建议之前(前置通知):例如:在方法(连接点)之前可以检查代码逻辑的正确性
  • 放回建议后(方法正常完成后执行的建议):方法返回不抛出异常
  • 抛出建议后:抛出异常执行的方法
  • 在(最终建议之后):无论连接点退出的方式正确与否,都会执行的建议.
  • 围绕建议:这是最强大的通知,可以直接改变原有代码的逻辑性

注意事项(重要)

  • 首先XML和注解的方式的几个通知的顺序不太一样
  • XML:Before->Around反射前的代码->Around反射后的代码->After->AfterReturning(AfterThrowing)
  • 注解的是:Around反射前的代码->Before->Around反射后的代码->AfterReturning(AfterThrowing)->After
  • 下面XML版本的类名有两个好像忘记加Advice了 如果用他使用注解就重名了 会出错
  • 读者使用的时候自行加上

例子及知识点


XML版本

配置工作

在pom.xml引入依赖
maven这里只是引入jar包

<dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.9.1</version>
</dependency>
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.1</version>
</dependency>

例子:入门例子前置通知

两个类
通知的类
Alt text
模拟需要的服务类
Alt text
然后再Spring配置文件中写入
Alt text

但是可能无法生效
Alt text
得在Spring容器中配置这个bean通过 容器getBean获得
Alt text
Alt text
下面的这个id如果需要被外部引用则配置
Alt text
Alt text

  • 上面的表达式的格式 第一个是权限修饰符(可以省略 可以写星号)
  • **第二个是返回类型 **
  • 第三个是哪个类下的哪个方法 也可以写*号
  • 参数(…) 表示任意参数, 也可以没有参数, 无数个参数也可以
  • 并且对于execution的参数是严格类型的比如
  • Alt text
  • 无法对String和Integer类型的参数织入
  • Alt text
    修改类添加一个before方法 传入参数org.aspectj.lang.JoinPoint
    Alt text
    然后织入
    Alt text
    这两个before方法都会执行 谁在上面谁先执行
    org.aspectj.lang.JoinPoint这个参数会获得切入点的信息 刚才可以获取方法名 还可以获取参数等等…
    例如可以通过上述的功能记录日志 通过org.aspectj.lang.JoinPoint获得方法名 参数 等等一系列

例子:通过返回通知获取结果

Alt text
修改service类
Alt text
返回通知类 这里的入参可以通过配置文件获得这个结果值
Alt text
配置到配置文件中
Alt text
同样的aop配置文件 织入连接点
Alt text
测试函数
Alt text
结果
Alt text

例子:异常通知

后面有些和上面的一样的就不啰嗦了 看图
Alt text
Alt text

Alt text
Alt text

结果如下图
Alt text

例子:环绕通知

Alt text
Alt text
Alt text
Alt text
结果如下图
Alt text
居然只是打印了环绕通知…
这里根本就没有放行也就说他掌握着你连接点的生杀大权

例子:带处理过程入参的环绕通知

Alt text
Alt text

然后结果如下
Alt text


注解版本

  • 因为之前的XML版本基础已经OK了 后面我会使用全部注解的版本
  • 下图是使用注解的两个容器类
    Alt text
    Alt text
    Alt text
  • 需要扫描advice下的通知类
    Alt text
  • 然后业务类很简单的一个模拟
    Alt text

Alt text

  • 上面的@Pointcut注解相当于定义一个模版 后面可以不用重复写切入点
  • 例如下面的后置通知
    Alt text
  • 只需要引入那个类的方法名即可
  • 等价于@After(“execution(public * com.theSevenSky.service.StudentService.*(…))”)
  • 剩下几个同理
    Alt text
    Alt text
    Alt text
    Alt text
  • (注):值得注意的是返回通知如果带入参但是没有返回值 这个方法是不生效的
  • (注):所以我上述的例子需要删除入参 如下图
    Alt text
    测试类如下图
    Alt text
    结果如下
    Alt text

多个切面问题

画一张图应该就很好理解
这个图是来源Java EE SSM那本书上的
Alt text

Alt text

总结AOP的几种通知

注解/XML属性通知备注
@Before/aop:before在被代理对象的方法前先调用前置通知
@Around/aop:around将被代理对象的方法封装起来,用环绕通知取代他环绕通知,可以通过反射使用原有方法
@After/aop:after在被代理对象的方法后调用后置通知
@AfterReturning/aop:after-returning在被代理对象的方法正常返回后调用返回通知,要求运行过程中没有产生异常
@AfterThrowing/aop:after-throwing在被代理对象的方法抛出异常后调用异常通知,要求运行过程中产生异常

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

相关文章

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;可以在任何地方使用用户名、密码、指定数据库等参数值与参数名不需要隔空格 不…

SpringBoot 实现SQL脚本自动执行

SpringBoot 实现配置SQL脚本自动执行 一. 背景 我们可能遇到过这种情况: 在公网开发时, 新增数据表非常容易, 直接登录到对应服务器的mysql / 使用Navicat访问mysql服务器. 然后去执行sql语句或脚本即可在内网开发时, 由于都在一个网段, 所以操作也比较方便但是在公网开发, 部…