IOC和Bean
IOC
IOC将对象的创建,依赖关系的管理和生命周期的控制从应用程序代码中解耦出来了
IOC容器的依赖注入(DI)
在程序运行过程中动态的向某个对象中注入他所需要的其他对象
依赖注入是基于反射实现的
Spring IOC 容器使用的是Map(concorrentMap)来存储Bean(Object)
概念
IOC,就是控制反转,也被称为依赖注入
在 Spring没出现之前,当一个对象需要使用其他对象来完成某些操作,就需要我们自己去创建或查找这些依赖的对象。
现在,有了 Spring,我们的对象交给 Spring管理,这些对象可以理解为存放在一个容器中的,这个容器就称为 Spring IoC 容器。在 IoC 容器中,对象不再自己管理它们的依赖,而是通过构造方法参数、工厂方法的参数或者在对象创建后通过属性设置来定义它们的依赖关系。
Spring的 IoC 容器负责在创建对象时注入它们依赖的其他对象,也就是自动地把依赖的对象提供给需要它们的对象。这样一来,对象不再需要主动去查找或创建它们的依赖,而是由容器在创建对象时帮助它们完成依赖注入的过程。
控制反转的概念主要是与传统的直接构造(即 new 操作)来控制对象依赖的方式相反。传统方式中,一个对象通常会直接创建或查找它所依赖的其他对象,而在 IoC 中,对象将自身的控制权交给了容器,容器负责管理对象的创建和依赖注入,因此被称为「控制反转」。
Bean
Bean生命周期的四个阶段
Bean循环依赖
-
通过field属性注入循环依赖(也就是注解@Autowired),IOC容器可能会解决掉
-
通过构造器注入循环依赖,IOC容器不会解决掉
Spring解决循环依赖
使用三级缓存解决循环依赖
-
第一级缓存:缓存的是已经实例化,属性注入,初始化的Bean对象(功能完备的bean)
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
-
第二级缓存:缓存的是实例化之后没有完成属性注入,初始化的Bean对象(也就是new出来没有填充依赖属性的bean) 意义:提前暴露Bean,让其他的Bean知道这个Bean存在于IOC之中
private final Map<String, Object> earlySingletonObjects = new HashMap<16>;
-
第三级缓存:生成原始对象进行AOP操作后的代理对象
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);