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

每日学习 Spring Aop源码分析 具体是如何创建Aop代理的

博客原文 : https://lionli.blog.csdn.net/article/details/135578383?spm=1001.2014.3001.5502

Spring中的代理模式 要首当其冲的肯定是AOP了 接下来我们来看看在AOP中是如何使用代理模式的

这里涉及到一个注解 如果需要开启AOP那么需要增加这个注解 @EnableAspectJAutoProxy
在这里插入图片描述
查看注解我们知道引入了一个 AspectJAutoProxyRegistrar 类,通过查看AspectJAutoProxyRegistrar 得到

AspectJAutoProxyRegistrar 该方法的作用就是往Spring容器中添加一个 BeanDefinition 类型为 AnnotationAwareAspectJAutoProxyCreator 用于创建代理对象

在这里插入图片描述
进入 AnnotationAwareAspectJAutoProxyCreator 看看是如何创建代理的
在这里插入图片描述
可以看到传入了AnnotationAwareAspectJAutoProxyCreator对象

由于 AnnotationAwareAspectJAutoProxyCreator 中并没有创建代理的方法 那么我们只能向上去父类里找, 通过不断的探索在 AnnotationAwareAspectJAutoProxyCreator -> AspectJAwareAdvisorAutoProxyCreator -> AbstractAdvisorAutoProxyCreator -> AbstractAutoProxyCreator 抽象类 AbstractAutoProxyCreator 中找到了 createProxy 方法
在这里插入图片描述
此方法是bean初始化的前置处理器 postProcessBeforeInstantiation 中使用的, 也就是说bean在初始化之前, 代理对象就已经创建好了

进入 createProxy 方法
在这里插入图片描述
进入 buildProxy 方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里我们可以看出 实际的代理对象是通过 ProxyFactory 工厂的 getProxyClass 与 getProxy 两个方法创建的

通过 getProxyClass 方法一直往下点 找到最终创建方法 DefaultAopProxyFactory#createAopProxy 为止
在这里插入图片描述

总结

@EnableAspectJAutoProxy 注解

@EnableAspectJAutoProxy 注解是启动 Spring AOP 功能的关键,它会启用基于注解的 AOP 支持。
当我们在 Spring 配置类上使用 @EnableAspectJAutoProxy 时,Spring 会通过 AspectJAutoProxyRegistrar 注册相关的 Bean,并进行自动代理的设置。

AspectAutoProxyRegistrar

AspectAutoProxyRegistrar 这个类的作用就是注册与 AOP 相关的 Bean,特别是自动代理创建器。在内部,AspectAutoProxyRegistrar 会注册一个 AnnotationAwareAspectJAutoProxyCreator 的 Bean 定义。
这个注册过程是通过 BeanDefinitionRegistry 来完成的。AspectAutoProxyRegistrar 通过 registerBeanDefinitions() 方法将一个 AnnotationAwareAspectJAutoProxyCreator 注册到容器中。

AnnotationAwareAspectJAutoProxyCreator

AnnotationAwareAspectJAutoProxyCreator 是实现 AOP 自动代理的核心组件之一,它是 AbstractAutoProxyCreator 的一个子类。
它的主要功能是扫描被 @Aspect 和切面相关注解(如 @Transactional)标记的 Bean,然后基于这些切面信息来创建代理对象。
当 Spring 容器启动时,AnnotationAwareAspectJAutoProxyCreator 会被初始化,它负责:
检查哪些 Bean 被切面标记(例如使用 @Aspect 注解的类)。
为符合条件的 Bean 创建代理(通过 JDK 动态代理或 CGLIB 代理)。
在目标 Bean 的方法执行之前和之后,插入切面逻辑(如通知)。

代理对象的创建

AnnotationAwareAspectJAutoProxyCreator 会使用代理机制(如 JDK 动态代理或 CGLIB 代理)为目标 Bean 创建代理对象。如果目标 Bean 实现了接口,则通常会使用 JDK 动态代理;如果没有实现接口,则会使用 CGLIB 创建子类代理。
代理对象的创建是在 Bean 实例化和注入过程中完成的。当 Spring 容器实例化一个 Bean 时,AnnotationAwareAspectJAutoProxyCreator 会检查该 Bean 是否需要代理。如果需要,它会为该 Bean 创建代理,并将代理对象注入到容器中。


http://www.kler.cn/a/542353.html

相关文章:

  • 食物过敏——来龙去脉
  • ES6 Proxy 用法总结以及 Object.defineProperty用法区别
  • C语言-结构体
  • 【设计模式】【行为型模式】职责链模式(Chain of Responsibility)
  • Qt通过FFmpeg打开RTSP并截图一帧作为背景
  • 信息科技伦理与道德3-2:智能决策
  • 简要介绍C++的“类(Class)”
  • 快速部署 DeepSeek R1 模型
  • 网络工程师 (29)CSMA/CD协议
  • 如何在 Elasticsearch 中设置向量搜索 - 第二部分
  • 设计模式-结构型-外观模式
  • 【Elasticsearch】监控与管理:集群监控指标
  • http 与 https 的区别?
  • 使用MyBatisMyBatis Plus实现SQL日志打印与执行监控
  • 23种设计模式的定义和应用场景-02-结构型模式-C#代码
  • 青少年编程与数学 02-009 Django 5 Web 编程 05课题、数据库与ORM
  • PG高可用学习@2
  • 大模型基本原理(二)——ChatGPT的工作原理
  • BUU35 [DASCTF X GFCTF 2024|四月开启第一局]EasySignin 100 【gopher打mysql】
  • 飞牛 使用docker部署MoviePilot V2自动化影视管理平台教程
  • 剪辑如何剪辑制作视频短视频剪辑学习怎么学,难吗?
  • 安川伺服控制器MP系列优势特点及行业应用
  • Oracle入门精读03_Oracle11g安装目录及子目录的结构简介
  • 计算机毕业设计Tensorflow+LSTM空气质量监测及预测系统 天气预测系统 Spark Hadoop 深度学习 机器学习 人工智能
  • 认识一下redis的分布式锁
  • aspectFill(填充目标区域的同时保持图像的原有宽高比 (aspect ratio)图像不会被拉伸或压缩变形