【Spring】aop的底层原理

🎄欢迎来到@边境矢梦°的csdn博文🎄

 🎄本文主要梳理 Spring 中的切面编程aop的底层原理和重点注意的地方 🎄
🌈我是边境矢梦°,一个正在为秋招和算法竞赛做准备的学生🌈
🎆喜欢的朋友可以关注一下🫰🫰🫰,下次更新不迷路🎆

Ps: 月亮越亮说明知识点越重要 (重要性或者难度越大)🌑🌒🌓🌔🌕  

 

目录

❤️切面编程介绍

🌸连接点和切入点的区别🚀

🌈Spring中扫描包注册bean

✨Spring中切面编程的两种实现

🎈切入表达式


❤️切面编程介绍

🎈Spring的切面编程是通过AOP(面向切面编程)机制来实现。AOP是一种编程范式,旨在将横切关注点(如日志记录、事务管理等)与核心业务逻辑分离以提高代码的模块性、可重用性和可维护性。

在Spring中,切面由两部分组成:切点(Pointcut)和通知(Advice)。

📌切点定义了在哪些连接点上应用切面逻辑。连接点是程序执行过程中可以插入切面逻辑的特定点,例如方法的执行、方法的调用等。切点可以使用表达式来选择特定的连接点,可以根据方法名、类名、注解等条件进行选择。

📌通知是切面逻辑的具体实现。它定义了在切点上要执行的行为,可以在切点的前后、异常抛出时、方法返回时等时机执行。常见的通知类型包括前置通知(Before)、后置通知(After)、异常通知(AfterThrowing)和返回通知(AfterReturning)等。

✍️除了切点和通知,切面还可以包括引入(Introduction)和切面顺序(Aspect Ordering)等功能。引入允许在现有类中添加新的方法和属性以增强类的功能。切面顺序定义了多个切面的执行顺序,以控制切面逻辑的执行顺序。

在Spring中,切面可以通过XML配置基于注解的配置或者基于Java的配置来定义。Spring提供了多种AOP实现,✨包括基于JDK的动态代理和基于CGlib的字节码生成。

🎉通过使用Spring的切面编程,可以将共同的横切关注点从核心业务逻辑中剥离出来,以提高代码的可维护性和可重用性。切面编程在日志记录、事务管理、安全性控制等方面有广泛的应用。


🌸连接点和切入点的区别🚀

在Spring框架的AOP编程中,连接点(Join Point)和切入点(Pointcut)是两个相关但不同的概念。

📌连接点是在程序执行过程中,可以插入切面逻辑的特定点。这些点可以是方法的执行、方法的调用或者异常的抛出等。在Spring中,连接点通常是方法的执行。连接是bean中的一些点

📌切入点是指在连接点中选择特定的连接点。它是一个表达式,描述了哪些连接点将被切面逻辑所应用。切入点可以根据方法名、类名、注解等条件来选择特定的连接点。

换句话说,切入点是一个定义,它决定了在哪些连接点上切面逻辑将会被执行。连接点是实际的程序执行点(Bean的),而切入点是定义了在哪些连接点上应用切面逻辑的规则。

🌰例如,可以通过切入点表达式来选择在所有的Service接口的方法执行时应用切面逻辑。而连接点则是具体的某个Service接口的方法执行。

在Spring AOP中,切入点表达式是使用AspectJ切入点表达式语言编写的,它具有灵活的语法,可以根据需求选择不同的连接点。(下文中)


🌈Spring中扫描包注册bean

🥝切面类不需要扫描进bean

在Spring中,当你使用 <context:component-scan> 进行包扫描时,它默认会扫描指定包及其子包中的类,并将带有特定注解的类注册为Spring容器中的bean。如果类没有加上注解,它将不会被注册为bean,也就不会被Spring进行管理。

然而,与AOP(面向切面编程)有关的切面通常不需要被注册为bean,因为它们是通过特定的AOP配置来创建和管理的。切面通常是带有 @Aspect 注解的类,并且它们的方法可以使用 @Before@After 等注解来定义切面逻辑。

所以,如果你的切面类(带有 @Aspect 注解的类)在指定的包中,它会被扫描到,但不会被注册为Spring容器中的bean。相反,Spring会使用AOP配置来创建并管理这些切面,例如使用 <aop:aspectj-autoproxy>@EnableAspectJAutoProxy 这样的配置来启用自动代理,从而将切面应用到相应的bean中。

总之,不需要将切面类注册为Spring bean,Spring会自动处理AOP相关的配置和代理生成。只需确保切面类在扫描的包中以及AOP配置正确即可。

🥝切面应用到的目标bean需要被扫描进bean

切面应用到的目标bean通常需要被Spring加载进容器中,以便Spring可以管理这些bean并应用切面的横切关注点(cross-cutting concerns)。

🏀总结切面的流程

具体来说,当你使用Spring AOP来应用切面时,以下是通常的流程:

  1. 你定义了一个切面类,该类使用 @Aspect 注解进行标记,同时定义了切面逻辑,如@Before、@After等通知。

  2. 你还定义了一个或多个目标bean,这些bean是你的应用程序的组成部分,切面将会应用到这些bean的方法上。

  3. Spring容器会扫描并加载这些目标bean,将它们实例化并管理它们的生命周期。

  4. 你配置Spring AOP,告诉Spring在哪些切点(方法执行点)应用你的切面。这通常通过<aop:aspectj-autoproxy>@EnableAspectJAutoProxy 这样的配置来完成。

  5. Spring会自动为目标bean创建代理对象,这些代理对象包含了切面逻辑。当你调用目标bean的方法时,切面逻辑会在方法执行前后生效,从而实现横切关注点的功能。

所以,虽然切面类本身不需要被显式注册为Spring bean,但目标bean需要被Spring加载并纳入容器管理,以便切面可以应用到它们的方法上。这就是Spring AOP的工作原理。


✨Spring中切面编程的两种实现

在Spring AOP中,不仅可以对实现了接口的bean进行切面编程,还可以对没有实现接口的bean进行切面编程。Spring使用代理对象来实现AOP,而代理对象可以基于接口(JDK动态代理)基于类(CGLIB代理)创建因此不需要目标bean实现接口也可以应用切面。

具体取决于AOP代理的方式:

  1. JDK动态代理:当目标bean实现了接口时,Spring会使用JDK动态代理来创建代理对象。这意味着只有实现了接口的方法才能被切面所影响。

  2. CGLIB代理:当目标bean没有实现接口时,Spring会使用CGLIB代理来创建代理对象。CGLIB可以代理没有实现接口的类,因此可以应用到这些类的方法。

✍️两个动态代理的区别

  1. JDK动态代理是面向接口的,只能增强实现类中接口中存在的方法。CGlib是面向父类的,可以增强父类的所有方法
  2. JDK得到的对象是JDK代理对象实例,而CGlib得到的对象是被代理对象的子类

📌要注意的是,如果你使用基于注解的切面编程(例如使用 @Aspect 注解),Spring AOP会自动选择适当的代理方式,无需手动指定只需确保你的切面和目标bean都配置正确,Spring会处理代理的创建和切面的应用。

所以,Spring AOP可以用于实现对实现接口和未实现接口的bean的切面编程。选择代理方式取决于目标bean是否实现了接口。

🎈切入表达式

📌图来自 : (III)AOP:第四节:切入点表达式 - 格物致知_Tony - 博客园 (cnblogs.com)

 切入点表达式

🥝作用
通过表达式的方式定位一个或多个具体的连接点。
🌸🌈语法细节
①切入点表达式的语法格式

execution([权限修饰符][返回值类型][简单类名/全类名][方法名]([参数列表]))

②🌰 基本使用

表达式execution(* com.sina.spring.ArithmeticCalculator.*(..))
含义

ArithmeticCalculator接口中声明的所有方法。

第一个“*”代表任意修饰符及任意返回值。

第二个“*”代表任意方法。
“..”匹配任意数量、任意类型的参数。
若目标类、接口与该切面类在同一个包中可以省略包名。

表达式execution(public * ArithmeticCalculator.*(..))
含义ArithmeticCalculator接口的所有公有方法
表达式execution(public double ArithmeticCalculator.*(..))
含义ArithmeticCalculator接口中返回double类型数值的方法
表达式execution(public double ArithmeticCalculator.*(double,..))
含义

第一个参数为double类型的方法。

“..”匹配任意数量、任意类型的参数。

表达式execution(public double ArithmeticCalculator.*(double, double))
含义参数类型为double,double类型的方法
表达式execution(* *.add(int,….)) l execution(* *.sub(int,..))
含义任意类中第一个参数为int类型的add方法或sub方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/129808.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SpringBoot】统一功能处理

目录 &#x1f383;1 拦截器 &#x1f380;1.1 拦截器的代码实现 &#x1f3a8;1.2 拦截器的实现原理 &#x1f9f6;2 拦截器应用——登录验证 &#x1f9ba;3 异常统一处理 &#x1f3ad;4 统一数据返回格式 &#x1f9e4;4.1 为什么需要统一数据返回格式 &#x1f9e3;4.2 统…

webserver 同步 I/O 模拟 Proactor 模式的工作流程

服务器基本框架、I/O 模型、事件处理模式 一、服务器编程基本框架 虽然服务器程序种类繁多&#xff0c;但其基本框架都一样&#xff0c;不同之处在于逻辑处理。 二、五种 I/O 模型 阻塞/非阻塞、同步/异步&#xff08;网络IO&#xff09;_呵呵哒(&#xffe3;▽&#xffe3;)&…

使用dockerfile文件部署Python+PyWebIO项目

1、安装docker 教程详见之前的内容。https://blog.csdn.net/weixin_44691253/category_12101661.html 2、打包好Python项目 之前的文章中有提到我编写测试工具使用的框架&#xff1a;PythonRequestsPyWebIO框架详解&#xff0c;编写测试工具提高团队测试效率 打包项目时&am…

JavaScript事件处理

表单事件 表单事件在HTML表单中触发 (适用于所有 HTML 元素&#xff0c;但该HTML元素需在form表单内)&#xff1a; 案例演示1&#xff1a;当文本框获取焦点&#xff0c;文本框背景为红色&#xff0c;当文本框失去焦点&#xff0c;文本框背景为黄色 <!DOCTYPE html> <…

【JAVA-Day05】深入理解Java数据类型和取值范围

深入理解Java数据类型和取值范围 深入理解Java数据类型和取值范围摘要一、Java的数据类型1.1 存储单位1.2 Java基本数据类型 二、Java的取值范围2.1 变量定义2.2 取值范围验证 三、总结 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f3fb;…

可靠的可视化监控平台应用在那些场景?

可视化监控平台是一种用户友好的工具&#xff0c;可以帮助用户实时监控IT设备的运行状态和网络流量&#xff0c;以及监测安全性和性能指标。它们通常采用图形化界面&#xff0c;使得用户能够直观地了解设备和网络的状态。 以下是一些可视化监控平台常见的应用场景&#xff1a;…

三、创建各个展示模块组件

简介 在文件 components 中创建轮播模块组件,引入App.vue展示。欢迎访问个人的简历网站预览效果 本章涉及修改与新增的文件:First.vue、Second.vue、Third.vue、Fourth.vue、Fifth.vue、App.vue、vite-env.d.ts、assets 一、修改vite-env.d.ts文件 /// <reference type…

Oracle VM VirtualBox 安装 Ubuntu Linux

Virtual Box VirtualBox是一个强大的、面向个人用户或者企业用户的虚拟机产品&#xff0c;其支持x86以及AMD64/Intel64的计算架构&#xff0c;功能特性丰富、性能强劲&#xff0c;支持GPL开源协议&#xff0c;其官方网址是www.virtualbox.org&#xff0c;由Oracle开源&#xf…

大数据安全 | (一)介绍

目录 &#x1f4da;大数据安全 &#x1f407;大数据安全内涵 &#x1f407;大数据安全威胁 &#x1f407;保障大数据安全 ⭐️采集环节安全技术 ⭐️存储环节安全技术 ⭐️挖掘环节安全技术 ⭐️发布环节安全技术 &#x1f407;大数据用于安全 &#x1f4da;隐私及其…

npm版本升级报错

解决方法&#xff1a; 执行npm install --legacy-peer-deps依赖对等 npm install xxx --legacy-peer-deps命令用于绕过peerDependency里依赖的自动安装&#xff1b;它告诉npm忽略项目中引入的各个依赖模块之间依赖相同但版本不同的问题&#xff0c;以npm v4-v6的方式去继续执行…

系统架构设计师(第二版)学习笔记----系统架构设计师概述

【原文链接】系统架构设计师&#xff08;第二版&#xff09;学习笔记----系统架构设计师概述 文章目录 一、架构设计师的定义、职责和任务1.1 架构设计师的定义1.2 架构设计师的任务 二、架构设计师应具备的专业素质2.1 架构设计师应具备的专业知识2.2 架构设计师的知识结构2.3…

如何应用运营商大数据精准营销?

如何应用运营商大数据精准营销&#xff1f; 越来越多的企业逐渐觉察到运营商大数据所带来的商业价值&#xff0c;精准营销也被他们用的越来越娴熟。那么&#xff0c;企业的大数据精准营销该如何应用呢&#xff1f;想必是很多资源有限的中小型公司最想了解的。 一 数据驱动运营…

Spring Boot - Junit4 / Junit5 / Spring Boot / IDEA 关系梳理

文章目录 PreJunit4 / Junit5 / Spring Boot / IDEAIDEA版本Spring-Boot-Older-Release-NotesSpringBootTest 起源 & Spring-Boot-1.4-Release-Notes2.0.0.RELEASE ----- 2.0.9.RELEASE2.1.0.RELEASE ----- 2.1.18.RELEASE2.2.0.RELEASE ~ 2.2.13.RELEASE2.3.0.RELEASE ~ 2…

使用本地mysql+linux实现mysql主从同步

1.配置linux 保证linux已经安装好了mysql1.1修改该linux配置文件 vim /etc/my.cnf1.2重启linux的mysql systemctl restart mysqld1.3使用账户密码登录linux中的mysql,查看是否配置成功 mysql> show master status;若显示有FIile和Posttion就表示注linux的主节点配置成功…

Android 自定义View之圆形进度条

很多场景下都用到这种进度条&#xff0c;有的还带动画效果&#xff0c; 今天我也来写一个。 写之前先拆解下它的组成&#xff1a; 底层圆形上层弧形中间文字 那我们要做的就是&#xff1a; 绘制底层圆形&#xff1b;在同位置绘制上层弧形&#xff0c;但颜色不同&#xff…

【实践篇】Redis使用规范清单详解

Redis 使用规范清单详解 文章目录 Redis 使用规范清单详解0. 前言参考资料 1. 键值对使用规范1. Key的命名规范2. 避免使用 bigkey2.1. "bigkey"的导致的问题2.2 避免"bigkey"问题解决方法2.2 1. 数据分片2.2.2. 数据压缩 3. 使用高效序列化方法和压缩方法…

web pdf 拖拽签章

web pdf 拖拽签章 主要通过火狐的pdfjs 来实现 1. 下载js 并编译 地址 https://mozilla.github.io/pdf.js/ 按照官网当下下载并编译就得到了js 2.其实也没有什么好讲的&#xff0c;都是用的js中的方法&#xff0c;官网中都有 按照步骤就能生成一个document元素&#xff0c;然…

Android常用的工具“小插件”——Widget机制

Widget俗称“小插件”&#xff0c;是Android系统中一个很常用的工具。比如我们可以在Launcher中添加一个音乐播放器的Widget。 在Launcher上可以添加插件&#xff0c;那么是不是说只有Launcher才具备这个功能呢&#xff1f; Android系统并没有具体规定谁才能充当“Widget容器…

Java 复习笔记 - 字符串篇

文章目录 一&#xff0c;API和API帮助文档&#xff08;一&#xff09;API&#xff08;二&#xff09;API帮助文档 二&#xff0c;String概述三&#xff0c;String构造方法代码实现和内存分析四&#xff0c;字符串的比较五&#xff0c;综合练习&#xff08;一&#xff09;用户登…

100个Python数据分析常见问题.pdf

大家好&#xff0c;我是涛哥。 Python语言要说什么效率高&#xff0c;什么学习了马上能见到效果&#xff0c;那非数据分析不可。 之前安排了Python常见问题&#xff0c;爬虫常见问题&#xff0c;面试常见问题等等&#xff0c;这不涛哥也给你大家安排了数据分析问题。 希望大…