第11集 解决代理类的循环依赖
【视频来源于:B站up主孙帅suns Spring源码视频】【微信号:suns45】
1、代理类A和代理类B如何解决循环依赖?
- getBean(“A”)
- createInstance(“A”)
- 放入到singletonFactorys【A[半成品]】
- A类的填充属性->填充B属性,
- getBean(“B”)
- createInstance(“B”)
- 放入到singletonFactorys【A[半成品],B[半成品]】
- B类的填充属性->填充A属性
- getBean(“A”)->从singletonFactorys中取出A半成品,A从singletonFactorys移动到了earlySginletonObjects
- 注意singletonFactorys存的value是方法,为了去处理代理类 而在执行getEarlyBeanReference执行beanPostProcessor加工,从A变成了Proxy A,并且加入代理池中。
- 代理缓存池【Proxy A】
- B进行初始化 容器注入 BeanPostProcessorBefore InitializingBean和invokeMethod BeanPostProcessorAfter proxyB创建完成,加入代理对象缓存池。【Proxy A,ProxyB】
- 接着B执行 addSingleton将earlySginletonObjects的B移入到singletonObjects。
- A属性填充完毕后接着继续给A进行初始化 执行 addSingleton将earlySginletonObjects的B移入到singletonObjects。
2、使用DefaultListableBeanFactory的两个子类
DefaultListableBeanFactory XmlClassPathBeanFactory
3、创建代理环境
![image-20230509161549352](https://i-blog.csdnimg.cn/blog_migrate/13bfde4290ae55dbe4ff7a261d384731.png)
![image-20230509161559074](https://i-blog.csdnimg.cn/blog_migrate/a4db9bfe925f4f11689e3b94c40b59bf.png)
![image-20230509161613245](https://i-blog.csdnimg.cn/blog_migrate/b47964bfc32787c28477a3414002cf1c.png)
![image-20230509161536689](https://i-blog.csdnimg.cn/blog_migrate/e03e17908a3d1f75d8cb847f971f4936.png)
![image-20230509161625973](https://i-blog.csdnimg.cn/blog_migrate/d82b2629ccc3b6c84f4e2984cc588123.png)
4、为什么Debug中找不到Proxy A的B属性
Proxy是为原始对象增强额外功能,应该看代理对象A的原始对象A的B属性。