1. IOC概念
IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。
Inversion of Control 简写为IOC,翻译成中文就是“控制反转”,它不是什么技术,是一种设计思想,它有一个别名叫DI(Dependency Injection),即依赖注入
控制反转就是由Spring容器来负责对象的生命周期和对象之间的关系
2. DI概念
DI—Dependency Injection,即“依赖注入”:是组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。
3. IOC和DI的关系
其实它们是同一个概念的不同角度描述
4. 主动和被动
1. 主动创建对象

2. IOC容器创建对象

5. IOC解决的问题
- 谁控制谁:IOC容器控制对象
- 控制声明:对象
- 为什么是反转:依赖的对象直接由 IoC 容器创建后注入到被注入的对象中,依赖的对象由原来的主动获取变成被动接受,所以是反转
- 哪些方面反转了:对象的获取方式被反转了
6. IOC提供对象的形式
- 构造方法注入
// 需求方
public class Demo {
// 被注入的对象
private DependencyObject dependencyObject;
Demo(DependencyObject dependencyObject) {
this.dependencyObject = dependencyObject;
}
}
- setter方法注入
public class Demo {
private DependencyObject dependencyObject;
public void setDependencyObject(DependencyObject dependencyObject) {
this.dependencyObject = dependencyObject;
}
}
- 接口注入
它需要被依赖的对象实现不必要的接口,带有侵入性。一般都不推荐这种方式。
7. Spring IOC组成部分
1. Resource 资源体系
本体系各组件分别代表了不同的资源访问策略

2. ResourceLoader 资源加载
Spring使用ResourceLoader的各种实现进行加载资源
3. BeanFactory bean工厂,bean容器
什么是bean:bean是被实例的,组装的及被spring容器管理的java对象
BeanFactory中的维护着一个BeanDefinition Map, 来进行bean的创建和管理
4. Beandefinition
描述bean对象
5. BeandefinitionReader
读取 Spring 的配置文件的内容,并将其转换成Ioc容器内部的数据结构:BeanDefinition
6. ApplicationContext spring容器,即应用的上下文
它是BeanFactory的升级版,对比BeanFactory的主要区别有:
- 继承 MessageSource,提供国际化的标准访问策略。
- 继承 ApplicationEventPublisher ,提供强大的事件机制。
- 扩展 ResourceLoader,可以用来加载多个Resource,可以灵活访问不同的资源。
- 对 Web 应用的支持。
7. 简述IOC容器的使用过程
ClassPathResource resource = new ClassPathResource("bean.xml");
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(resource);
- 资源定位:获取资源
- 装载:获取 BeanFactory
- 注册:根据新建的 BeanFactory 创建一个BeanDefinitionReader对象,该Reader 对象为资源的解析器
Spring 整个资源记载过程已经分析完毕。下面简要总结下:
Spring 提供了 Resource 和 ResourceLoader 来统一抽象整个资源及其定位。使得资源与资源的定位有了一个更加清晰的界限,并且提供了合适的 Default 类,使得自定义实现更加方便和清晰。
AbstractResource 为 Resource 的默认实现,它对 Resource 接口做了一个统一的实现,子类继承该类后只需要覆盖相应的方法即可,同时对于自定义的 Resource 我们也是继承该类。
DefaultResourceLoader 同样也是 ResourceLoader 的默认实现,在自定 ResourceLoader 的时候我们除了可以继承该类外还可以实现 ProtocolResolver 接口来实现自定资源加载协议。
DefaultResourceLoader 每次只能返回单一的资源,所以 Spring 针对这个提供了另外一个接口 ResourcePatternResolver ,该接口提供了根据指定的 locationPattern 返回多个资源的策略。其子类 PathMatchingResourcePatternResolver 是一个集大成者的 ResourceLoader ,因为它即实现了 Resource getResource(String location) 也实现了 Resource[] getResources(String locationPattern)。