IOC是一种可以帮助我们解耦各业务对象间依赖关系的对象绑定方式。
一、注入方式(通常我们会说IOC是通过DI来实现的,那么有哪些注入方式呢?)
- 构造方法注入(对相同类型的参数的处理会比较困难,维护和使用比较麻烦)
- setter方法注入(侵入性弱,good)
- 接口注入(退役,强制被注入对象实现不必要的接口,带有侵入性)
- 关于实现:反射(正常注入)+CGLIB动态生成其子类(方法注入,每一次返回不同的对象)
二、IOC Service Provider的职责(抽象出来的概念,可以指代任何将IOC场景中的业务对象绑定到一起的实现方式)
- 业务对象的构建管理
- 业务对象间的依赖绑定
- 直接编码的方式
- 配置文件方式
- 注解的方式
三、BeanFactory—Spring的IOC容器
- 基础类型IOC容器,提供完整的IOC服务支持。如果没有特殊指定,默认采用延迟初始化策略。
- BeanFactory,Bean工厂,其实其就像一个工厂,通过“流水线”生产出一个个Bean,然后管理着所有被他“生产”出来的Bean。
- 其实可以将BeanFactory的实现看作两个阶段:容器启动阶段、Bean实例化阶段。同时spring的IOC容器在实现的时候,在每个阶段都加入了相应的容器扩展点,以便我们可以根据具体场景的需要加入自定义的扩展逻辑。
- 容器启动阶段:
- 通过某种途径加载Configuration MetaData。
- 解析和分析,编组为相应的BeanDefinition(每一个Bean都有一个对应的BeanDefinition,保存着这个类的各种信息)。
- 将BeanDefinition注册到相应的BeanDefinitionRegistry(定义抽象了Bean的注册逻辑,简单来说就是hold bean definitions),启动工作完成。
- Bean实例化阶段:
- 根据准备信息,就可以根据需要生产Bean了,BeanFactory的实现类负责具体Bean的注册和管理工作。
四、ApplicationContext——Spring的IOC容器
- ApplicationContext是一个更加先进的容器,除了包含BeanFactory的所有功能,还进一步拓展了基本容器的功能,真实“青出于蓝而胜于蓝”!
- 统一资源加载策略:spring提供了一套基于org.springframework.core.io.ResourceLoader接口的资源抽象和加载策略。
- 国际化信息支持
- 容器内部事件发布
- 多配置模块加载的简化