目录
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+循环依赖欢迎分享,转载请注明来源:内存溢出
评论列表(0条)