什么是 IoC 容器?
这个问题我觉得可以拆分为 3 小问:
- IoC 是什么意思?
- 容器 指什么?
- IoC 容器是什么?
首先对于 IoC Inversion Of Control 翻译过来即 控制反转。理解 ”控制反转“ ,我觉得首先是要明白,控制了什么?而后反转给了谁?这两点弄清楚这个概念其实就很明了了。
首先控制是指控制 bean 的创建,及其内部的依赖,例如常用的 @Autoware 和 @Resource,当然这里的 bean 指的就是实体类。通常来说我们在使用 bean 的时候都会自己手动 new
一个,而这里指的反转就是将这个动作交给 容器 去做了。所以得到的结果就是,我们并不关心我们要使用的 bean 何时创建,我们只需要声明并使用就可以了。其中的依赖由容器来帮助我们自动注入,所以也经常说依赖注入。
其次是 容器 “容器” 这个词听起来很高大上,但它并不接地气,我们很难在这种抽象的概念中去理解它。其实具体到 Spring ,容器在实现上必然需要一个实际的载体,这个载体也逃不出 Java 的基础数据结构,Spring 在实现它的时候本质上就是 ConcurrentHashMap
,对应的 key 是 bean 的 beanName ,value 是实例化好的 bean。
这里我们看一眼传说中的 ”单例缓存池“
// DefaultSingletonBeanRegistry.class
/** Cache of singleton objects: bean name to bean instance. */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
所以 IoC 容器 其实就是一个为我们生产管理 bean 的容器。
如常见的 ClassPathXmlApplicationContext
AnnotationConfigApplicationContext
该容器帮助我们统一管理 bean 的创建过程,注入管理相关依赖。其中也为我们提供的大量的拓展点来定制 bean 的创建。
IoC 帮助我们做到了 bean 的统一管理,以及程序解耦,使得我们编写的程序更加灵活。如依赖接口,轻松更改实现、统一的 Aop 切面处理等。