一、基础知识储备
1。春之豆注入法
a)构造函数注入
@Service public class BeanOne { //注入对象BeanTwo private BeanTwo bt; //构造器 public BeanOne(BeanTwo bt) { this.bt = bt ; } } @Service public class BeanTwo { public BeanTwo(BeanOne bo) { ...... ...... } }
总结:构造函数注入方法。Spring无法解决这种注入方法的循环依赖。当项目启动时,此方法将引发异常(
beancourrentincreationexception)。至于为什么解决不了,我暂时不解释,后面会解释。
b)。Setter模式单实例注入
@Service public class BeanOne { //注入对象BeanTwo private BeanTwo bt; //一定要写被注入对象的set方法 public void setBeanTwo(BeanTwo bt) { this.bt = bt; } } @Service public class BeanTwo { ...... ......}
总结:这个方法也会造成循环依赖,但是Spring会在初始化的时候处理,解决循环依赖问题。
c)。单一模式字段属性注入循环依赖(默认模式)
相信大家写代码的时候都会用到这种写法:
@Servicepublic class AServiceImpl implements AService { @Autowired private BService bService; ...}@Servicepublic class BServiceImpl implements BService { @Autowired private AService aService; ...}
总结:属性注入方法实际上类似于Setter注入方法。Spring会在bean初始化的时候解决,但是两次注入还是有区别的。
2。三种注射方法的区别
属性注入不能有效指明依赖
相信很多人都遇到过一个bug,依赖注入的对象为null,启动依赖容器时遇到的问题是配置的依赖注入缺少一个注释什么的。
这种方式过于依赖注射容器。当整个依赖容器没有启动的时候,这个类就无法运行,也无法提供这个类在反射时需要的依赖。
依赖注入的核心思想之一就是容器管理的类不应该依赖于容器管理的依赖。用白话来说,如果类使用依赖注入类,那么这个类必须能够在没有这些依赖的情况下正常运行。但是,使用变量喷射并不能保证这一点。
而如果是采用构造器注入或者set注入,就可以避免以上问题:
使用set方式时,这是一种选择注入,可有可无,即使没有注入这个依赖,那么也不会影响整个类的运行。使用构造器方式时已经显式注明必须强制注入。通过强制指明依赖注入来保证这个类的运行
2。循环依赖项
循环依赖:顾名思义,就是n个类的循环(嵌套)引用。
一般来说,n个Bean相互参照,最终形成一个闭环。用一个经典的插画,可以这样表达(A、B、C都代表对象,虚线代表引用关系):
二、Spring如何解决单列循环依赖?
首先Spring内部维护了三个***p,也就是我们通常所说的电影缓存。
在Spring的DefaultSingletonBeanRegistry类中,您会发现上面定义的三个映射:
singletonObjects(一级缓存),称“
单例池
”“
容器
”,存储完整的单例Bean的地方。singletonFactories(二级缓存) 存放原始的 bean 对象(尚未填充属性),用于解决循环依赖earlySingletonObjects(电影缓存) 映射Bean的
早期
引用,也就是说在这个Map里的Bean不是完整的,甚至还不能称之为“
Bean
”,只是一个实例化
Instance
.
1.bean创建过程
2。关键代码分析
在创建bean之前获取它,getSingleton()
先从一级缓存singletonObjects中去获取。如果获取不到或者对象正在创建中(isSingletonCurrentlyInCreation()),那就再从二级缓存earlySingletonObjects中获取。如果还是获取不到,且允许singletonFactories(allowEarlyReference=true)通过getObject()获取。就从电影缓存singletonFactory.getObject()获取。(如果获取到了就从singletonFactories中移除,并且放进earlySingletonObjects。其实也就是从***缓存移动到了二级缓存
未完待续。。。
本文来自年轻人玩的就是心跳投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/603216.html