【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/

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

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

相关文章

【Go】Linux、Windows、Mac 搭建Go开发环境

1、Linux 第一步&#xff0c;在 官网 下包&#xff0c;如 go1.23.4.linux-386.tar.gz&#xff08;注意架构区分&#xff09; 第二步&#xff0c;将包上传至服务器&#xff0c;假如上传到 tmp目录下第三步&#xff0c;安装# 解压 tar -C /app -xzvf go1.23.4.linux-386.tar.gz#…

电子科技大学考研,计算机与软件专业怎么选择?

电子科技大学在计算机与软件领域具备卓越实力&#xff0c;其毕业生就业前景及薪资水平均颇为可观。因此&#xff0c;学生应依据个人课程专长来选定专业。若各项课程均表现出色&#xff0c;推荐25届考生优先考虑软件专业&#xff0c;因其上岸难度相对较低。 接下来&#xff0c;C…

Unity3D实现抽象类的应用场景例子

系列文章目录 unity知识点 文章目录 系列文章目录👉前言👉一、示例👉二、使用步骤👉三、抽象类和接口的区别👉3-1、抽象类👉3-2、接口类👉壁纸分享👉总结👉前言 假设我们正在制作一个游戏,游戏中有多种不同类型的角色,这些角色都有一些共同的行为(比如移…

(五)机器学习 - 数据分布

数据分布&#xff08;Data Distribution&#xff09;是指数据在不同值或值区间内的分布情况&#xff0c;它描述了数据点在整个数据集中是如何分散或集中的。数据分布可以通过多种方式来分析和表示&#xff0c;包括图形和数值方法。 常见的数据分布特征和描述数据分布的方法&…

【恶意软件检测论文】用于 Android 恶意软件检测的混合 ML-DL 方法

目录 摘要1. 引言2. 文献综述传统检测方法机器学习方法混合方法最新进展移动恶意软件检测的挑战 3. 问题陈述4. 研究目标5. 提出的方法论1. 数据集获取2. 数据预处理3. 特征工程和选择4. 模型实现5. 模型评估6. 比较和分析 6. 结论 用于 Android 恶意软件检测的混合 ML-DL 方法…

Linux网络 UDP socket

背景知识 我们知道&#xff0c; IP 地址用来标识互联网中唯一的一台主机&#xff0c; port 用来标识该主机上唯一的一个网络进程&#xff0c;IPPort 就能表示互联网中唯一的一个进程。所以通信的时候&#xff0c;本质是两个互联网进程代表人来进行通信&#xff0c;{srcIp&…

STM32F407+LAN8720A +LWIP +FreeRTOS UDP通讯

STM32F407+LAN8720A +LWIP +FreeRTOS ping通 上一篇实现了LWIP ping 通 本篇实现UDP通讯 实现如下功能: 串口1空闲中断+DMA接收,收到数据用UDP发送UDP接收,收到数据用串口1发送STM32CUBEIDE配置和代码 1. 配置UARAT1的空闲中断+DMA接收 UART1接收到数据,释放信号量,在任…

Git-基础操作命令

目录 Git基础操作命令 case *查看提交日志 log 版本回退 get add . Git基础操作命令 我们创建并且初始化这个仓库以后&#xff0c;我们就要在里面进行操作。 Git 对于文件的增删改查存在几个状态&#xff0c;这些修改状态会随着我们执行Git的命令而发生变化。 untracked、…

简单的Java_Swing小项目

Swing小项目 无需任何额外配置&#xff0c;直接可以在eclipse用 非常简单的文件结构 简单的登录界面 进去后就大概是这么个样子 很久以前写的了&#xff0c;我就不一一打开展示了。内容和无UI版本差不多&#xff0c;只是用简单的Swing实现了界面化操作 数据是可以保存在…

回归任务与分类任务应用及评价指标

能源系统中的回归任务与分类任务应用及评价指标 一、回归任务应用1.1 能源系统中的回归任务应用1.1.1 能源消耗预测1.1.2 负荷预测1.1.3 电池健康状态估计&#xff08;SOH预测&#xff09;1.1.4 太阳能发电量预测1.1.5 风能发电量预测 1.2 回归任务中的评价指标1.2.1 RMSE&…

嵌入式学习(18)-stm32F407串口接收空闲中断+DMA

一、概述 在一些一次性接收大批量数据的引用场合&#xff0c;如果使用接收中断会频繁的进入接收中断影响代码的运行效率。为了解决这个问题可以使用串口的空闲中断DMA实现。 二、应用 在网上招了一些例程在STM32F407的平台上都没有跑通会出现各种异常&#xff0c;主要原因还…

Docker的镜像

目录 1. 镜像是什么&#xff1f;&#xff1f;2. 镜像命令详解2.1 镜像命令清单2.2 docker rmi命令2.3 docker save命令2.4 docker load命令2.5 docker history命令2.6 docker import命令2.7 docker image prune命令2.8 docker build命令 3. 镜像的操作4. 离线迁移镜像5. 镜像存…

Git版本控制工具--介绍及安装

1.Git的简介 Git是目前世界上最先进的的分布式控制系统&#xff08;没有之一&#xff09;。 很多人都知道&#xff0c;Linus在1991年创建了开源的Linux&#xff0c;从此&#xff0c;Linux系统不断发展&#xff0c;已经成为最大的服务器系统软件了。 Linus虽然创建了Linux&…

【OJ题解】面试题三步问题

个人主页: 起名字真南的CSDN博客 个人专栏: 【数据结构初阶】 &#x1f4d8; 基础数据结构【C语言】 &#x1f4bb; C语言编程技巧【C】 &#x1f680; 进阶C【OJ题解】 &#x1f4dd; 题解精讲 目录 **题目链接****解题思路****1. 问题分析****2. 递归思路****3. 优化方案&a…

CTFHub解题笔记之Web信息泄露篇:11.HG泄露

1.题目描述 题目位置 网页显示 2.解题思路 ‌HG泄露是指Mercurial版本控制系统中的敏感信息被未经授权的个人或系统访问的情况。Mercurial&#xff08;翻译过来是水银&#xff0c;所以通常简称为HG&#xff09;是一种分布式版本控制系统&#xff0c;用于管理软件源代码或其…

linux网络编程 | c | 多线程并发服务器实现

多线程并发服务器 基于该视频完成 12-多线程并发服务器分析_哔哩哔哩_bilibili 通过的是非阻塞忙轮询的方式实现的 和阻塞等待的区别就是&#xff0c;阻塞是真的阻塞了&#xff0c;而这个方式是一直在问有没有请求有没有请求 linux | c | 多进程并发服务器实现-CSDN博客 …

R语言——缺失值处理

目录 缺失数据 1 R中的缺失值 2查看缺失值is.na() 3 去除缺失值 1 R中的缺失值 在R中&#xff0c;NA代表缺失值&#xff0c;NA是不可用&#xff08;可能是0&#xff0c;可能是其他值&#xff0c;NA是未知的&#xff09;&#xff0c;notavailable的简称&#xff0c;用来存储…

快速上手:利用 FFmpeg 合并音频文件的实用教程

FFmpeg 是一个强大的多媒体处理工具&#xff0c;能够轻松地对音频、视频进行编辑和转换。本文将介绍如何使用 FFmpeg 来合并&#xff08;拼接&#xff09;多个音频文件为一个单一文件。无论您是想要创建播客、音乐混音还是其他任何形式的音频项目&#xff0c;这都是一个非常实用…

常见软件设计模式介绍:三层架构、MVC、SSM、EDD、DDD

三层架构&#xff08;View Service Dao&#xff09; 三层架构是指&#xff1a;视图层 view&#xff08;表现层&#xff09;&#xff0c;服务层 service&#xff08;业务逻辑层&#xff09;&#xff0c;持久层 Dao&#xff08;数据访问层&#xff09; 表现层&#xff1a;直接跟前…

重庆轨道交通2号线建桥地铁站自动化监测

1. 项目概述 本次项目位于重庆市轨道交通2号线中大渡口区的建桥站&#xff0c;轨道交通2号线是重庆市首条开通运营的城市轨道交通&#xff0c;也是中国首条开通运营的跨座式单轨线路。建桥站为轨道交通2号线延长线中的一站&#xff0c;本站为高架侧式&#xff0c;临近恒大麓山…