Spring 典型,非典型循环依赖问题及其解决方法

  1、设计原则

  在设计时,我们应该尽量避免出现循环依赖的情况,应该把循环依赖的公共部分进行分层,抽取公共部分,然后依赖公共部分

  2、典型循环依赖

  但是由于某些业务之间的相互调用太多,总会有一些漏网之鱼出现了循环依赖,但是当你使用 @Autowired进行依赖注入时,程序是可以正常运行的。 当使用构造函数进行依赖注入时,则是不可以正常运行的,因为无法创建bean

  3、到底什么是依赖

  依赖,说的简单点,就是A 要用到B 的方法去执行逻辑,但是A 在何时需要用到B ,决定了这种依赖关系是强依赖还是弱依赖

  4、强依赖

  就是A 的产出就必须要有B的参与,没有B ,A就没法被生产出来,打个比方,就是没你不行

  构造函数注入是强依赖,Spirng 没法把对象new 出来,所以基于构造函数的循环依赖会导致无法创建bean

  5、弱依赖

  就是A 的产出需要有B的参与,没有B,A也能被生产出来,打个比方,没你也可以,有你是锦上添花

  @Autowired字段注入就是弱依赖,Spirng 可以把对象new 出来,所以项目可以正常启动

  那能不能正常执行呢? 可以, 按道理是不可以正常执行的,为什么现在可以呢,因为对你的循环依赖进行了调解

  6、依赖调解郑州人流医院哪家好 http://mobile.zyyyzz.com/

  什么是依赖调解,依赖调解,就是解决循环依赖这个问题的,他是DI 实现的依赖调解

  7、Spring 是如何把构造函数进行解耦的 - Spring的依赖注入模型

  1、调用构造函数、解析强依赖(一般是无参构造),并创建类实例

  2、根据Field/GetterSetter中的依赖注入相关注解、解析弱依赖,并填充所有需要注入的类

  3、调用生命周期中的初始化方法(例如@PostConstruct注解或InitializingBean的afterPropertiesSet方法),执行实际的初始化业务逻辑

  这样,构造函数的功能就由原来的三个弱化为了一个,只负责类的构造。并将类的配置交由DI,将类的初始化逻辑交给生命周期。

  这样,就把基于构造函数的注入工作不会影响Bean 的创建工作,调解了强依赖导致的无法调解的问题

  8、非典型的循环依赖场景

  按照上面的理解,好像如果出现循环依赖,只要把构造函数改为@Autowired字段注入就可以了

  但是,其实构建bean的顺序也可能会导致是用 @Autowired字段注入 也无法调解的循环依赖

  配置类中如果出现了循环依赖,则可能会出现这个情况,无法调解

  因为配置类必须先加载自己的全部配置后,也就是先解决配置类自己的全部依赖,才会加载他自己定义的Bean

  这个时候,这里就是强依赖了,这也是为什么配置类建议使用构造函数注入的原因,他可以在设计上杜绝无法调解的循环依赖问题,因为实质上,在配置类里面定义的Bean 是强依赖于暴露他的配置类的。

posted @ 2019-12-10 14:02  网管布吉岛  阅读(410)  评论(0编辑  收藏  举报