“这是我参与8月更文挑战的第29天,活动详情查看:8月更文挑战”
晚上好,我是卢卡,对于很多新手,项目中刚开始使用的框架就是spring,但是spring你到底了解多少,对于数据操作的底层对象调用,如何减少重复造轮子,这些都是我们要掌握的问题。本期,我们就利用spring中如何解决,依赖注入(Dependency Injection),循环依赖怎么解决
循环依赖
循环依赖,通常是指Bean对象之间的互相依赖,比如A对象创建需要B对象,也就是A依赖于B,依赖类推,B依赖于C,C依赖于A, 形成一个完整的闭环,以下图为:
多个bean之间互相依赖,形成一个闭环====>循环依赖
一定是默认的单例bean中,属性互相引用的场景,也就是说 spring初始化容器方法refresh()中,对待bean,都是初始化后的单例对象==>也就是scope=singleton
每个对象是单例的对象,互相依赖的时候,可以直接调用, spring底层怎么保证AB循环依赖的问题?
所以说,对于循环多次依赖,我们要求的是,单例且set注入------>可以避免BeanCurrentlyInCreationException的问题\
spring循环依赖的注入方式
对于spring循环依赖中,有一个误区,通常可以分为构造器注入和set方法注入,两种注入方式会有影响,我们来找寻官网中的理解;
-
实例化构造器注入带来的beancurrentlyIncreationException的问题;
****模拟A和B两个实例对象,在循环依赖中,利用构造器互相注入,看能否实现循环依赖:
创建三个类:
结论:
因为我们要创建一个A,就要在构造器加载过程中,加入一个B,但是又 要重复创建A,和B;constructor无法解决这个问题;
2:利用set注入进行spring的循环依赖注入
循环依赖set方法注入,可以依赖实现;
上述是基于JAVA SE实现的代码,但是我们要寻找底层spring容器中,到底对于循环依赖怎么实现呢?
我们先确定一个概念,就是spring容器化;
可以把spring容器化,也就是存放bean对象,(实例化对象)可以相互复用的一个池化思想,举个例子,我每次要去买鱼和鸡肉,但是这个是俩对象,存在于两个菜市场,spring容器就作为中间点,把鱼肉和鸡肉都放入里面, 然后我要使用的时候,就从池子中直接取用,这样的好处是:
- 减少通讯的资源损耗
- 节省对象复用
- 更好的控制对象
- 创建符合要求的初始化对象
spring作为一个优秀的框架,极大程度上对于程序员来说,减少了创建对象,集中管理对象,复用等问题,做出了很大的贡献,减少了重复造轮子,也就是说,我们要创建一个对象的时候 ,我们不用new ,而是通过权限控制,IOC(Inversion of Control)是指容器控制程序对象之间的关系,而不是传统实现中,由程序代码直接操控。控制权由应用代码中转到了外部容器,控制权的转移给spring容器,更好的集中控制和管理对象;
下期我们现在开始觊觎spring容器化来实现循环依赖到底怎么玩?