IOC容器概述
IOC容器是实现控制反转的载体,它可以在对象生成或初始化时直接将数据注入对象,也可以通过对象引用注入到对象数据域中,总之就是将对象的创建,引用的管理交给容器,降低系统设计的复杂性和耦合性。
IOC容器的设计和实现
在spring IOC容器系列中,有2个主要的容器系列;一个是实现BeanFactory接口,另一个是ApplicationContext应用上下文。
IOC容器为开发者管理对象间的依赖对象关系提供服务,至于选择什么样的容器取决于用户的需要,spring提供了各式各样的IOC容器供给用户选择。
spring 通过BeanDefinition来管理基于spring应用中的各种对象和它们之间的依赖关系,定义bean
- IOC容器的设计
IOC接口的设计图
BeanFactory接口设计了getBean()方法,通过此方法可以获取到IOC容器管理的Bean,Bean通过指定名字来索引
BeanFactory容器的设计原理
BeanFactory提供了IOC容器使用的规范,则以XmlBeanFactory为例,来说明IOC容器的设计原理:
从XmlBeanFactory的实现入手分析,来看看IOC容器是怎么实现的。
- XmlBeanFactory继承DefaultListableBeanFactory - 由Resource类指定BeanDefinition的信息来源 - 创建一个载入BeanDefinition的读取器 - 从定义好的资源位置载入配置信息,具体解析过程由XmlBeanDefinitionReader来完成
IOC容器的初始化
IOC容器的初始化由refresh()方法启动,具体启动过程包括:Resource定位,载入和注册。
- Resource定位:具体指的是BeanDefinition的资源定位,由ResourceLoader通过统一的Resource接口
- BeanDefinition载入:这个载入过程是指把用户定义好的Bean表示成IOC容器内部的数据结构。
- 注册BeanDefinition:通过BeanDefinitonRegistry接口来实现,是把载入过程解析得到的BeanDefinition向IOC容器注册
IOC容器初始化过程,一般不包含Bean依赖注入的实现,Bean定义的载入过程和依赖注入是两个独立的过程,依赖注入一般发生在首次通过getBean()获取Bean的时候。