【Spring6源码・AOP】代理对象的创建

news2024/9/20 6:35:45

前三篇Spring IOC的源码解析与这一章的AOP是紧密相连的:

  1. 【Spring6源码・IOC】BeanDefinition的加载

  2. 【Spring6源码・IOC】Bean的实例化

  3. 【Spring6源码・IOC】Bean的初始化 - 终结篇

首先介绍我们本章的demo:

一个接口,一个实现,一个切面,一个测试类。

public interface TestInterface {

    void hello();
}
@Component
public class TestImpl implements TestInterface {

    @Override
    public void hello() {
        System.out.println("hello,world!");
    }
}

@Aspect
public class AspectJTest {

    @Pointcut("execution(* *.hello(..))")
    public void test(){}

    @Before("test()")
    public void before(){
        System.out.println("before test..");
    }

    @After("test()")
    public void after(){
        System.out.println("after test..");
    }

    @Around("test()")
    public Object around(ProceedingJoinPoint p){
        System.out.println("Around before1");
        Object o = null;
        try {
            o = p.proceed();
        } catch (Throwable e) {
            e.printStackTrace();
        }
        System.out.println("Around after1");
        return o;
    }
}
@SpringBootTest
public class test {

    @Autowired
    private TestInterface test;
    
    @Test
    public void testData(){
        test.hello();
    }
}

前几章bean实例化之后,我们对bean进行了属性填充,紧接着就会调用initializeBean()方法返回该bean的代理对象,如果不需要被代理,那么就会直接返回该bean。最后无论返回的是代理对象还是原始对象,都会将其存进一级缓存中。


首先我们看看是如何创建代理对象的。

步入initializeBean方法,applyBeanPostProcessorsAfterInitialization方法就是用来生成代理对象,

在这里插入图片描述
步入applyBeanPostProcessorsAfterInitialization方法,在这个方法里面,循环遍历所有 BeanPostProcessor,调用它的 postProcessAfterInitialization 方法做后置处理。其中,用于生成代理对象的,就是 AnnotationAwareAspectJAutoProxyCreator

在这里插入图片描述
步入postProcessAfterInitialization 方法中,真正做事的是wrapIfNecessary方法,包装成代理对象。
在这里插入图片描述

步入wrapIfNecessary方法,会在里面根据我们的切面配置,获取对应的通知器。

在这里插入图片描述
然后就是调用 createProxy 方法创建代理对象,这里做了一个判断,如果这个bean包含一些切面的配置,那么就会调用createProxy对bean创建代理。
在这里插入图片描述
步入createProxy方法中,最终会调用buildProxy方法来完成代理的创建。
在这里插入图片描述

会经过一下几步,然后通过proxyFactory获取代理。

在这里插入图片描述

步入getPoxy方法,首先会创建代理器。得到一个aop代理工厂,用它去创建一个aop代理。
在这里插入图片描述
步入createAopProxy,这里会决策aop到底是用JDK动态代理还是cglib代理。

如果这个bean是接口的话,会使用Jdk动态代理。因为我们这里的bean是testImpl,所以,我们这里使用的是cglib代理。

在这里插入图片描述
创建完代理器,就回去创建代理类,步入如下方法:createAopProxy()

在这里插入图片描述
最终会调用buildProxy()方法,构建代理类和代理对象。

最终创建的方法有点深,大家请看。

在这里插入图片描述
步入===
在这里插入图片描述
步入===
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

以上创建完了代理对象,最后再把代理对象存进一级缓存。

在这里插入图片描述
在这里插入图片描述
最终,会真正的执行我们的目标方法,但是步入该方法,会进入cglib代理类的拦截方法。我们下一节好好聊聊这块。

在这里插入图片描述

cglib代理类
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文速递】ECCV2022 - 开销聚合与四维卷积Swin Transformer_小样本分割

【论文速递】ECCV2022 - 开销聚合与四维卷积Swin Transformer_小样本分割 【论文原文】:Cost Aggregation with 4D Convolutional Swin Transformer for Few-Shot Segmentation 获取地址:https://arxiv.org/pdf/2207.10866.pdf博主关键词: …

紧聚焦涡旋光束app设计-VVB2.0

紧聚焦涡旋光束app设计-VVB2.0前言界面预览功能演示写在最后前言 时隔几个月,花了点时间,将之前用matlab设计的app紧聚焦涡旋光束matlab gui设计进行一次修改,这次发布2.0版本,本次修改的范围主要是将原来的界面进行重做&#xf…

软件设计师中级复习小总结

软件设计师中级复习小总结 计算机与体系结构 K 1024 k 1000 B 字节 b 位 1字节 8位 8bit(位)1Byte(字节) 1024Byte(字节)1KB KB,MB,GB之间的换算关系是:1024KB1MB,1024MB1GB,1024GB1TB K,M&#x…

DevOps 实战概述

一、背景越来越多的团队使用DevOps,个人觉得原因有二,其一市场需求,从瀑布到敏捷的过程能看出市场就是需要团队响应快,小步快跑,风险低效率高,但是敏捷只解决了开发团队的问题并没有解决运维团队的问题&…

16、Javaweb_ajax的JSjQuery实现方式JSON_Java对象互转用户校验案例

AJAX: 1. 概念: ASynchronous JavaScript And XML 异步的JavaScript 和 XML 1. 异步和同步:客户端和服务器端相互通信的基础上 * 客户端必须等待服务器端的响应。在等待的期间客户端不能做其他操作。 * 客户端不需要…

[LeetCode周赛复盘] 第 328 场周赛20230115

[LeetCode周赛复盘] 第 328 场周赛20230115 一、本周周赛总结二、 [Easy] 6291. 数组元素和与数字和的绝对差1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6292. 子矩阵元素加 11. 题目描述2. 思路分析3. 代码实现四、[Medium] 6293. 统计好子数组的数目1. 题目描述2. 思路分…

文献阅读总结--合成生物学工程促进大肠杆菌中莽草酸的高水平积累

题目:Systems engineering of Escherichia coli for high-level shikimate production (ME 2022) 0 前言 本版块内容为记录阅读的文献内容总结经典方法手段。本文内容来自相关文献,在文末做来源进行详细说明对文献中内容不做真实性评价。 1 具体内容 …

标准化和归一化概念澄清与梳理

标准化和归一化是特征缩放(feature scalingscaling)的主要手段,其核心原理可以简单地理解为:让所有元素先减去同一个数,然后再除以另一个数,在数轴上的效果就是:先将数据集整体平移到有某个位置,然后按比例…

【C进阶】动态内存管理

家人们欢迎来到小姜的世界&#xff0c;<<点此>>传送门 这里有详细的关于C/C/Linux等的解析课程&#xff0c;家人们赶紧冲鸭&#xff01;&#xff01;&#xff01; 客官&#xff0c;码字不易&#xff0c;来个三连支持一下吧&#xff01;&#xff01;&#xff01;关注…

Spring 中最常用的 11 个扩展点

目录 1.自定义拦截器 2.获取Spring容器对象 2.1 BeanFactoryAware接口 2.2 ApplicationContextAware接口 3.全局异常处理 4.类型转换器 5.导入配置 5.1 普通类 5.2 配置类 5.3 ImportSelector 5.4 ImportBeanDefinitionRegistrar 6.项目启动时 7.修改BeanDefiniti…

MySQL高级【MVCC原理分析】

1&#xff1a;MVCC1.1&#xff1a;基本概念1). 当前读 读取的是记录的最新版本&#xff0c;读取时还要保证其他并发事务不能修改当前记录&#xff0c;会对读取的记录进行加 锁。对于我们日常的操作&#xff0c;如&#xff1a;select ... lock in share mode(共享锁)&#xff0c…

技术人员和非技术人员如何写出优质博客?-涵子的个人想法

大家好&#xff0c;我是涵子。今天&#xff0c;我们来沉重的聊聊一个大家都很关心的一个问题&#xff1a;技术人员和非技术人员如何写出优质博客&#xff1f; 目录 前言 初写博客&#xff0c;仰望大师 中段时期&#xff0c;无粉无赞 优质博客&#xff0c;涨粉涨赞 优质内容…

前端编写邮件html各邮箱兼容及注意事项

近期由于项目需要&#xff0c;第一次编写邮件html模板&#xff0c;发现各种邮箱兼容问题&#xff0c;尤其是windows自带的邮箱outlook兼容性极差&#xff0c;在此简单做下记录。 注意事项&#xff08;全局样式规则&#xff09; 使用越垃圾的样式越好&#xff0c;绝大部分css3…

Spring面试题

Spring概述&#xff08;10&#xff09; https://blog.csdn.net/zhang150114/article/details/90478753 什么是spring? Spring是一个轻量级JavaEE开发框架&#xff0c;最早有Rod Johnson创建&#xff0c;目的是为了解决企业级应用开发的**业务逻辑层和其他各层的耦合问题。*…

Eclipse 连接 SQL Server 数据库教程

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

JUC面试(一)——JUCJMMvolatile 1.0

JUC&JMM JMM JUC&#xff08;java.util.concurrent&#xff09; 进程和线程 进程&#xff1a;后台运行的程序&#xff08;我们打开的一个软件&#xff0c;就是进程&#xff09;&#xff0c;资源分配单位线程&#xff1a;轻量级的进程&#xff0c;并且一个进程包含多个线程…

Docker部署Nexus通过Maven推送及拉取代码

&#x1f60a; 作者&#xff1a; 一恍过去&#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390&#x1f38a; 社区&#xff1a; Java技术栈交流&#x1f389; 主题&#xff1a; Docker部署Nexus通过Maven推送及拉取代码⏱️ 创作时间&#xff1a; 2023…

如何利用ChatGPT帮你写代码?

最近爆火的ChatGpt相信大家都不陌生&#xff0c;听说它还能写代码&#xff0c;而且能力不凡。作为合格的嵌入式软件工程师&#xff0c;必须得充分利用起来&#xff01; 获取系统IP地址 先写一个脚本&#xff0c;获取系统IP地址吧&#xff0c;没想到还有详细的注释&#xff01…

华亚转债上市价格预测

华亚转债基本信息转债名称&#xff1a;华亚转债&#xff0c;评级&#xff1a;A&#xff0c;发行规模&#xff1a;3.4亿元。正股名称&#xff1a;华亚智能&#xff0c;今日收盘价&#xff1a;62.84&#xff0c;转股价格&#xff1a;69.39。当前转股价值 转债面值 / 转股价格 * …

juc系列(1)---进程,线程,并行,并发

目录概述进程线程关系并发并行&#xff1a;同步异步&#xff1a;对比概述 进程 程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至CPU,数据加载至内 存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载…