Spring源码学习:setter循环依赖
创始人
2024-05-15 05:46:56
0

1.案例:

@Component
public class A {private B b;@Autowiredpublic void setB(B b) {this.b = b;}public B getB() {return b;}public void f(){System.out.println(b);}
}
@Component
public class B {private A a;@Autowiredpublic void setA(A a) {this.a = a;}public void f(){System.out.println(a);}
}
public class App {public static void main(String[] args) {AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);A a = ctx.getBean(A.class);a.f();System.out.println(a.getClass());System.out.println(a.getB().getClass());}
}

2.源码:

1.1.在三级缓存中查找a(没找到)

1.2.未找到,开始创建a的Bean实例

1.2.2.将实例对象包装为WrappedInstance

1.2.3.将该实例添加到第三级缓存中

1.2.4.开始初始化a实例的所有属性

1.2.4.1.开始初始化a的属性b,b是setter循环依赖属性

1.2.4.2.在三级缓存中查找b

1.2.4.3.未找到,开始创建b的Bean实例

1.2.4.4.通过反射对B类实例化

1.2.4.5.将实例对象包装为WrappedInstance

1.2.4.6.将该实例添加到第三级缓存中

1.2.4.7.开始初始化b实例的所有属性

1.2.4.7.1.开始初始化b的属性a,a是setter循环依赖属性

1.2.4.7.2.在三级缓存中查找a

1.2.4.7.3.在第三级缓存中找到,获取a的实例

重复1.1.的工作

1.2.4.7.4.将a实例从第三级缓存降到第二级缓存

1.2.4.7.5.初始化b实例的所有属性结束,b的Bean创建完成

1.2.4.7.6.将b添加到第一级缓存,并从后两级中移除

1.2.4.8.初始化a实例的所有属性结束,a的Bean创建完成

1.2.4.9.将a添加到第一级缓存,并从后两级中移除

3.流程总结:

1.开始实例化a

1.1.在三级缓存中查找a

1.2.未找到,开始创建a的Bean实例

1.2.1.通过反射对A类实例化

1.2.2.将实例对象包装为WrappedInstance

1.2.3.将该实例添加到第三级缓存中

1.2.4.开始初始化a实例的所有属性

1.2.4.1.开始初始化a的属性b,b是setter循环依赖属性

1.2.4.2.在三级缓存中查找b

1.2.4.3.未找到,开始创建b的Bean实例

1.2.4.4.通过反射对B类实例化

1.2.4.5.将实例对象包装为WrappedInstance

1.2.4.6.将该实例添加到第三级缓存中

1.2.4.7.开始初始化b实例的所有属性

1.2.4.7.1.开始初始化b的属性a,a是setter循环依赖属性

1.2.4.7.2.在三级缓存中查找a

1.2.4.7.3.在第三级缓存中找到,获取a的实例

1.2.4.7.4.将a实例从第三级缓存降到第二级缓存

1.2.4.7.5.初始化b实例的所有属性结束,b的Bean创建完成

1.2.4.7.6.将b添加到第一级缓存,并从后两级中移除

1.2.4.8.初始化a实例的所有属性结束,a的Bean创建完成

1.2.4.9.将a添加到第一级缓存,并从后两级中移除

4.三级缓存机制

一级:初始化完成的Bean

二级:实例化待初始化的对象

三级:对象工厂类,提供对象代理功能

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...