Spring 循环依赖(5.2.x)

Spring 循环依赖(5.2.x),第1张

目录

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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/788713.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存