| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> Spring 循环依赖(5.2.x) -> 正文阅读 |
|
[Java知识库]Spring 循环依赖(5.2.x) |
目录 2.回顾创建拥有简单依赖关系Bean的过程(类A里依赖类B) 1.回顾getBean过程????????Spring getBean过程如上时序图所示,AbstractBeanFactory第一次调用getSingleton方法入参为beanName: ????????如果未查询到Bean信息那么就会二次调用getSingleton方法,入参为beanName和ObjectFactory: ????????这里用了一个lambda表达式,这次会尝试创建Bean,内部会回调到上图红框里createBean方法开始创建Bean。 2.回顾创建拥有简单依赖关系Bean的过程(类A里依赖类B)????????代码执行栈:? ????????代码Debug Son类: ?????????Father类: ? ? ? ? XML配置: ????????Debug源码,在populateBean填充son对象内部teacher对象前,son对象内部的teacher属性默认填充为RuntimeBeanReference类实例: ????????在具体注入属性的方法AbstractAutowireCapableBeanFactory#applyPropertyValues方法 resolveValueIfNecessary方法中有这么一行判断: ????????而在resolveReference的构造函数中,我们又见到熟悉的getBean了: ? ? ? ? ?然后还是按照原来的逻辑,尝试获取Father类实例,如果单例池中不存在则创建father实例,填充father实例属性,初始化father实例,最后将father实例添加到单例池中: ? ? ? ? 最后上文中RuntimeBeanReference是在什么时候被设置到son实例中的呢,答案是在解析XML配置信息封装BeanDefinition时,SimplePropertyNamespaceHandler#decorate方法中设置的: ????????总结一下:在解析Son类XML配置信息封装BeanDefinition时,会判断XML中是否配置了ref标签,如果配置了,那么就会new一个RuntimeBeanReference对象来标记Son类中存在依赖其他Bean的行为(teacher对象),在后期populateBean填充Son类属性的时候会判断该类中是否存在类行为RuntimeBeanReference的属性值(此时Son类中成员属性teacher的值为RuntimeBeanReference类实例),如果存在则递归进行所需依赖Bean的创建,最后将创建好的Bean添加到单例池中。 3.Spring的AOP是在什么时候实现的4.Spring是如何解决循环依赖的5.AOP+循环依赖 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 1:36:15- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |