07,spring循环依赖
2021-05-07 17:00:50 0 举报
spring循环依赖
作者其他创作
大纲/内容
发现拿不到从第三个缓存里拿
此时:bean工厂有两个半成品bean
否
此时:set集合有两条
populatebean方法会完成依赖注入
判断是否支持循环依赖
发现需要注入UserService
注入后返回,就可以拿到userService半成品bean
doCreateBean创建IndexService对象
实例化IndexService
这时候IndexService是个bean了放入容器单例池
解析@Resource实例化并注入
解析@Autowried注解实例化并注入
populatebean方法完成注入set属性值,比如:bean name
第三级缓存mapearlySingletonObjects
同时,判断是否支持循环依赖放入单例工厂
也会执行一系列的BeanPostProcessor(后置处理器)改变对象
第一级缓存mapsingletonObjects(spring容器的单例池)
单例bean工厂存在的意义就在于当调用getBean返回实例之前,可做很多其他的事情,比如:增加AOP功能,给bean加一个代理
同样放入set集合
addSingletonFactory()
会去getBean(userService)
去获取IndexService的bean
同时
调用getSingleton方法
循环依赖举例:1,IndexService,注入UserService @AutoWired UserService2,UserService,注入IndexService @AutoWired IndexService这样就产生了循环
从spring容器单例池中获取(第一级缓存)singletonObjects
IndexService是否正在创建查看set集合
往单例工厂(第二级缓存)put进去一个半成品的IndexService的bean
拿不到判断是否允许循环依赖
创建对象之前
现在IndexService暂时还只是个对象(doCreateBean创建出来的)并不是bean
因为此时IndexService还只是半成品,并不是bean,没有放入容器也拿不到
先把Userservice对象创建出来
注入IndexService到UserService
执行getObject()方法生产一个对象拿出半成品bean
Userservice同样要执行populatebean方法
实例化UserService的过程
spring是支持默认单例循环依赖的注意:@Scope(“prototype”)原型不可能循环引用如果循环依赖的bean都是prototype,那么无论先获取哪个bean,都会失败,在Spring容器启动后,只有当获取的第一个bean是通过属性注入依赖的singleton时,才会成功,别的情况都会失败源码关闭循环引用:AnnotationConfigApplicationContext(Appconfig.class)构造方法里加:setAllowCircularReferences(false);
里面执行属性填充的方法
从这里面判断
判断userService是否正在创建
第三级缓存SingletonFactory
又要进行userService的实例化
CommonAnnotationBeanPostProcessor
同样要填充UserService的属性
实例化过程
发现循环依赖需要注入IndexService
是
第二级缓存SingletonFactories暴露出去
IndexService实例化完成
put第三级缓存同时remove第二级缓存
第二级缓存mapSingletonFactories
第三级缓存:为了提高性能,因为getobject()方法相当复杂,里面调用很多processor方法,所以为了避免重复生产
AutoWriedAnnotationBeanPostProcessor
java对象和bean的区别:1,bean要有完整的生命周期2,bean最终是存在于spring容器中的,是有spring实例化出来的3,bean一定是一个java对象,但java对象并不能称为一个bean
放入一个set集合后期判断IndexService是否正在创建
0 条评论
下一页