栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring 循环依赖(5.2.x)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring 循环依赖(5.2.x)

目录

1.回顾getBean过程

2.回顾创建拥有简单依赖关系Bean的过程(类A里依赖类B)

3.Spring的AOP是在什么时候实现的

4.Spring是如何解决循环依赖的

5.AOP+循环依赖


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+循环依赖

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/844873.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号