网站建设宣传psd,哪些网站可以做代理商,凡科网企业账号登录,网站视频制作1.什么是Bean的循环依赖#xff1f; 简单来说就是在A类中#xff0c;初始化A时需要用到B对象#xff0c;而在B类中#xff0c;初始化B时需要用到A对象#xff0c;这种状况下在Spring中#xff0c;如果A和B同时初始化#xff0c;A#xff0c;B同时都需要对方的资源…1.什么是Bean的循环依赖 简单来说就是在A类中初始化A时需要用到B对象而在B类中初始化B时需要用到A对象这种状况下在Spring中如果A和B同时初始化AB同时都需要对方的资源就会僵持不下。这也就是Spring中的循环依赖问题。Spring框架对这种属性所产生的循环依赖的解决办法很简单就是使用Autowired注解如下
public class BeanA {Autowiredprivate BeanB beanB;
}public class BeanB {Autowiredprivate BeanA beanA;
} 对于构造方法的循环依赖Spring可采用Lazy或者使用Setter()方法去解决这里我们不做讨论。
2.Autowired 在Spring中我们可以使用Autowired注解对属性或者方法参数进行标注会从IOC容器中拿到对应的实例自动注入。
3.解决循环依赖的具体细节 首先Spring中内部有三大缓存在 DefaultSingletonBeanRegistry 类中定义了 3 个 Map 对象充当缓存。分别是
singletonObjects一级缓存用于保存实例化初始化完成之后的Bean实例ConcurrentHashMap存储线程安全。earlysingletonObjects二级缓存用于保存实例化完成还未初始化完的Bean实例属于提前暴露。singleFactories三级缓存存放生成Bean的工厂也相当是存放了获取Bean的一个回调方式。 具体实现
先把创建A的工厂存入到三级缓存中之后A进行实例化实例化之后需要属性赋值B 然后再一级、二级、三级缓存中找B如果都没有将创建B的工厂存入到三级缓存之后B进行实例化B实例化后需要属性赋值A所以就去三级缓存中利用创建A的工厂回调拿到A之后B的属性赋值完毕然后将拿到的A存放到二级缓存中并删除三级缓存中A的工厂等到B整体初始化完毕将B放入一级缓存然后A的属性赋值B也完成等到A整体初始化完毕则将A存放到一级缓存中并删除二级缓存的A。