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

【SpringAOP】深入浅出SpringAOP从原理到源码

AOP对象是如何创建的

对于熟悉Spring IOC流程源码的同学来说,一定了解bean的整个生命周期,也就是从实例化、属性填充、初始化三个过程。那么对于Bean 工厂来说,是如何保证需要创建代理的对象创建代理的呢。
在这里插入图片描述
从图中可以看到,本质是通过注解 @EnableAspectJAutoProxy, 通过引入 @Import(AspectJAutoProxyRegistrar.class)
在这里插入图片描述
顶层其实就是一个BPP
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
核心调用流程图就在这里,这里可以通过debug的方式查找。

在这里插入图片描述

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(MyAopAspectJPostProcessor.class)
public @interface MyEnableAspectjAutoProxy {
}
@Configuration
@ComponentScan("com.qxlx.aopprocessor")
@MyEnableAspectjAutoProxy
public class Config {}

最终通过自定义注解的方式 也实现了这种一个简易版本的AOP

详解 @EnableAspectJAutoProxy

proxyTargetClass

	/*** Indicate whether subclass-based (CGLIB) proxies are to be created as opposed* to standard Java interface-based proxies. The default is {@code false}.*/boolean proxyTargetClass() default false;

其实就是是否基于CGlib进行动态代理对于接口,默认时false。

exposeProxy

	/*** Indicate that the proxy should be exposed by the AOP framework as a {@code ThreadLocal}* for retrieval via the {@link org.springframework.aop.framework.AopContext} class.* Off by default, i.e. no guarantees that {@code AopContext} access will work.* @since 4.3.1*/boolean exposeProxy() default false;	 

其实这个字段的含义就是从4.3.1 版本开始,如果设置为true的话,会把当前对象的代理对象存储到ThreadLocal对象中。

		// 可以用来解决 本类同方法调用事务失效时 获取代理对象IUserService userService = (IUserService) AopContext.currentProxy();userService.delete();

其实就是根据exposeProxy的值 判断是否true,将当前代理对象存储到ThreadLocal中。

        // JdkDynamicAopProxy 代理if (this.advised.exposeProxy) {// Make invocation available if necessary.oldProxy = AopContext.setCurrentProxy(proxy);setProxyContext = true;}
// 本质其实就是ThreadLocal private static final ThreadLocal<Object> currentProxy = new NamedThreadLocal<>("Current AOP proxy");

AnnotationAwareAspectJAutoProxyCreator

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
再往下看的话 其实就是分别JDK和Cglib生成代理的代码了。
在这里插入图片描述

1.BeanPostProcess创建代理。考虑循环引用问题
2.ProxyFactory
setTarget、setAdvisor、
3.底层的代码
AOPProxy
CglibAopProxy
JdkDnmiacAopProxy

1.AOP创建了动态代理
2.动态字节码动态 运行时执行 是如何执行的?
代理是在运行的过程中,才会把原始对象的功能与额外功能进行整合。
动态代理 运行效率低于静态代理

代理类执行过程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里总整体进行总结下,一个是代理对象的生成,是在bean after BPP阶段进行调用生成的,另外一个就是实际方法的调用就是在原有的类基础上代理类加了拦截表达式,根据表达式判断当前方法是否需要执行对应的前置 后置 等方法,完整额外功能的添加。

在这里插入图片描述
感兴趣的可以通过 看 具体的源码

https://github.com/qxlx/spring-code/blob/main/src/main/java/com/qxlx/aopprocessor/

相关文章:

【SpringAOP】深入浅出SpringAOP从原理到源码

AOP对象是如何创建的 对于熟悉Spring IOC流程源码的同学来说&#xff0c;一定了解bean的整个生命周期&#xff0c;也就是从实例化、属性填充、初始化三个过程。那么对于Bean 工厂来说&#xff0c;是如何保证需要创建代理的对象创建代理的呢。 从图中可以看到&#xff0c;本质…...

Java 从查询超时到性能提升 (实战讲解)

目录 1. 问题所示2. 原理分析3. 解决方法3.1 代码优化3.2 索引优化3.3 删数据 1. 问题所示 查询返回速度慢&#xff0c;导致前端页面无数据显示 前端和后端均未报错&#xff0c;但后端未能在合理时间内返回结果到前端 后端没有报错日志 2. 原理分析 单独分析代码中的对算法…...

《C 语言携手 PaddlePaddle C++ API:开启深度学习开发新征程》

在深度学习领域&#xff0c;PaddlePaddle 作为一款强大的深度学习框架&#xff0c;为开发者提供了丰富的功能和高效的计算能力。而 C 语言&#xff0c;凭借其高效性和广泛的应用场景&#xff0c;与 PaddlePaddle 的 C API 相结合&#xff0c;能够为深度学习开发带来独特的优势。…...

Mysql之存储过程

MySQL 存储过程&#xff08;Stored Procedure&#xff09; 1. 概念 存储过程是一组预编译的 SQL 语句集合&#xff0c;可以通过调用名称来执行。存储过程可以接收参数&#xff0c;并支持复杂的业务逻辑&#xff08;如条件语句、循环、异常处理等&#xff09;。它们可以提高代…...

XV6 开发环境搭建

Step 1 搭建ubuntu 20.04 虚拟机 注意&#xff1a;一定要使用ubuntu 20.04&#xff0c;该版本可以直接通过deb安装gnu编译工具链。 安装完虚拟机后&#xff0c;换apt源。 ubuntu20.04镜像下载链接 设置root账户密码: sudo passwd root Step 2 下载解压qemu 5.1.0 wget ht…...

Windows 系统下 Python 环境安装

一、引言 Python 作为一种广泛应用的编程语言&#xff0c;在数据分析、人工智能等领域发挥着重要作用。本文将详细介绍在 Windows 系统上安装 Python 环境的步骤。 二、安装前准备 系统要求 Windows 7 及以上版本一般都能支持 Python。硬件方面&#xff0c;通常 2GB 内存、几…...

VMware Workstation的有线连接消失了

进入/var/lib目录下 cd /var/lib 查看是否存在NetworkManager 文件 ls 将其删除&#xff0c;然后虚拟机reboot一下。 sudo rm -r NetworkManager reboot 解决了&#xff0c;可以联网...

73页车企大数据平台规划与数据价值挖掘应用咨询项目方案解读

该项目旨在帮助乘用车公司规划大数据平台并提高数据挖掘应用水平&#xff0c;以满足业务部门对数据的需求&#xff0c;同时保证数据完整性和真实性。数据应用体系现状存在数据孤岛和数据关注维度不统一的问题&#xff0c;导致业务部门无法便捷使用数据并无法进行业务预测。大数…...

MIF格式详解,javascript加载导出 MIF文件示例

MIF 格式详解 MIF&#xff08;MapInfo Interchange Format&#xff09;是由Pitney Bowes Software开发的一种文本格式&#xff0c;用于存储地理空间数据。它通常与地图可视化和地理信息系统&#xff08;GIS&#xff09;相关联。MIF文件通常成对出现&#xff0c;一个.mif文件用…...

若依实现图片上传时自动添加水印

文章目录 总体思路1. 修改通用上传方法2. 去除文件路径前两级目录3. 添加水印方法运行效果总结 为了解决图盗用&#xff0c;并有效保护图片版权&#xff0c;若依项目需要实现一个功能&#xff1a;上传图片时&#xff0c;自动在图片上添加水印。这不仅可以有效防止盗用&#xff…...

用于日语词汇学习的微信小程序+ssm

日语词汇学习小程序是高校人才培养计划的重要组成部分&#xff0c;是实现人才培养目标、培养学生科研能力与创新思维、检验学生综合素质与实践能力的重要手段与综合性实践教学环节。本学生所在学院多采用半手工管理日语词汇学习小程序的方式&#xff0c;所以有必要开发日语词汇…...

【信息系统项目管理师】高分论文:论信息系统项目的范围管理(融媒体发布系统)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 正文1、规划范围管理2、收集需求3、定义范围4、创建WBS5、确认范围6、控制范围正文 我市xx社区作为智慧社区建设的试点社区,将通过各种创新技术手段,促进小区公共服务智能管理应用,实现社区中的基础设施、环…...

Kaggler日志--Day5

进度24/12/15 昨日复盘 Intermediate Mechine Learning之类型变量 读两篇讲解如何提问的文章&#xff0c;在提问区里发起一次提问 实战&#xff1a;自己从头到尾首先Housing Prices Competition for Kaggle Learn Users并成功提交 Intermediate Mechine Learning之管道&#…...

VScode MAC按任意键关闭终端 想要访问桌面文件

说明 最近配置MAC上CPP的运行环境&#xff0c;在安装必要的CPP插件后&#xff0c;配置launch和task等json文件后&#xff0c;点击运行三角形&#xff0c;每次都会跳出main想要访问桌面上的文件。并且输出也是在调试控制台&#xff0c;非常逆天。 尝试 尝试1:尽管我尝试将ta…...

小粑记故乡的记忆

小粑&#xff0c;是我的故乡一安徽池州一带盛行的小吃。约成人掌心大小&#xff0c;厚度只三、四厘米&#xff0c;故谓之“小”。 小粑&#xff0c;主打取材随性&#xff0c;方便常做常吃。这也许就是它抓住人的味蕾&#xff0c;渐次流行开来&#xff0c;成为当地名小吃的主要原…...

git使用小记

环境&#xff08;centos为例&#xff09;&#xff1a; yum -y install gitmkdir git_dir && cd git_dirgit clone *** 修改代码&#xff1a; git checkout master 切到主分支git pull 拉取最新代码git branch dev 创建开发分支git checkout dev 切换到开发分支修…...

Python实现办公自动化——自动编写word文档

Python实现办公自动化——自动编写word文档 前言安装python-docxpython-docx使用创建word文档设置纸张方向、大小和页边距统一设置格式插入文本插入表格插入图片 结语 前言 工作中有大量的报告编写需求&#xff0c;在不停地复制粘贴之后&#xff0c;突然想到&#xff0c;这种高…...

番外篇 | BGF-YOLO:引入双层路由注意力、广义特征金字塔网络和第四检测头,提高YOLOv8检测性能

前言:Hello大家好,我是小哥谈。本文提出了一种名为BGF-YOLO的新模型,通过引入双层路由注意力、广义特征金字塔网络和第四检测头,提高YOLOv8在脑肿瘤检测中的性能,采用多层特征融合与动态稀疏注意机制以减少特征冗余。 🌈 目录 🚀1.基础概念 🚀2.网络结构 �…...

Python运维自动化之字典Dict

字典Dict(哈希表) Dict即Dictionary&#xff0c;也称为mapping。 Python中&#xff0c;字典由任意个元素构成的集合&#xff0c;每一个元素称为Item&#xff0c;也称为Entry。这个Item是由(key, value)组成的二元组。 字典是可变的、无序的、key不重复的key-value键值对集合。…...

axios请求拦截器和响应拦截器,封装naive-ui的 Loading Bar加载条和useMessage消息提示

接之前的博客设计从0开始边做边学&#xff0c;用vue和python做一个博客&#xff0c;非规范化项目&#xff0c;怎么简单怎么弄&#xff0c;跑的起来有啥毛病解决啥毛病&#xff08;三&#xff09;&#xff0c;目前已经完成了基本的功能demo&#xff0c;但是请求接口不可能每个页…...

杰理之通话之后siri就会异常,siri出来的非常慢【篇】

在连接蓝牙上没有通话前耳机按键打开siri是正常的...

告别Fiddler和Charles,用Proxyman在Android 13上抓HTTPS包(附network_security_config.xml配置)

移动端开发者必备&#xff1a;Proxyman在Android 13上的HTTPS抓包实战指南 如果你是一名移动端开发者&#xff0c;一定遇到过这样的场景&#xff1a;应用在测试环境中表现良好&#xff0c;但上线后却出现各种网络请求异常。传统的Fiddler和Charles虽然功能强大&#xff0c;但在…...

麦橘超然Flux图像生成控制台快速部署:一键启动你的AI绘画服务

麦橘超然Flux图像生成控制台快速部署&#xff1a;一键启动你的AI绘画服务 1. 项目概述与核心优势 麦橘超然Flux图像生成控制台是一个基于DiffSynth-Studio构建的离线图像生成Web服务。它集成了majicflus_v1模型&#xff0c;采用float8量化技术&#xff0c;显著降低了显存占用…...

【愚公系列】《剪映+DeepSeek+即梦:短视频制作》047-转场:短视频一气呵成的秘密(转场类型)

&#x1f48e;【行业认证权威头衔】 ✔ 华为云天团核心成员&#xff1a;特约编辑/云享专家/开发者专家/产品云测专家 ✔ 开发者社区全满贯&#xff1a;CSDN博客&商业化双料专家/阿里云签约作者/腾讯云内容共创官/掘金&亚马逊&51CTO顶级博主 ✔ 技术生态共建先锋&am…...

高效Navicat密码找回工具:无需编程的数据库连接密码恢复方案

高效Navicat密码找回工具&#xff1a;无需编程的数据库连接密码恢复方案 【免费下载链接】navicat_password_decrypt 忘记navicat密码时,此工具可以帮您查看密码 项目地址: https://gitcode.com/gh_mirrors/na/navicat_password_decrypt 当数据库连接密码成为工作阻碍&a…...

STM32单片机NRST管脚异常复位问题解析与EMC设计优化

1. STM32单片机NRST管脚异常复位问题解析最近在客户现场遇到一个棘手的STM32G474单片机异常复位问题&#xff0c;发生在EMS浪涌测试过程中。作为嵌入式开发者&#xff0c;复位问题往往是最让人头疼的故障之一。今天我就把这个案例的完整排查过程和解决方案分享给大家&#xff0…...

从理论到模型:HFSS仿真平面发夹滤波器的关键步骤与参数优化

1. HFSS仿真前的理论准备 在开始HFSS仿真之前&#xff0c;我们需要先完成一些理论计算工作。这就像盖房子要先画图纸一样&#xff0c;没有理论指导的仿真就像无头苍蝇。我刚开始做滤波器设计时就犯过这个错误&#xff0c;直接上手建模&#xff0c;结果调参调到怀疑人生。 平面发…...

如何在10分钟内构建高质量AI语音克隆模型:Retrieval-based-Voice-Conversion-WebUI完全指南

如何在10分钟内构建高质量AI语音克隆模型&#xff1a;Retrieval-based-Voice-Conversion-WebUI完全指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trendi…...

wxlivespy:微信视频号直播数据高效捕获与智能分析解决方案

wxlivespy&#xff1a;微信视频号直播数据高效捕获与智能分析解决方案 【免费下载链接】wxlivespy 微信视频号直播间弹幕信息抓取工具 项目地址: https://gitcode.com/gh_mirrors/wx/wxlivespy 在数字化直播浪潮中&#xff0c;实时数据已成为驱动运营决策的核心引擎。wx…...

从序列到结构:ESM蛋白质语言模型核心原理与实践解析

1. 蛋白质语言模型为何成为研究热点 最近几年&#xff0c;蛋白质语言模型突然在生物信息学领域火了起来。作为一个长期关注AI在生命科学领域应用的开发者&#xff0c;我发现这背后有两个关键驱动力&#xff1a;一是蛋白质结构预测的世纪难题有了新解法&#xff0c;二是Transfor…...