参考文章:
IoC 了,作为 Spring 第一个最核心的概念,在面试中经常被问到,也是学习Spring首先需要明白的内容。
IOC是什么
IoC 全称为 Inversion of Control
,翻译为 “控制反转”,它还有一个别名为 DI(Dependency Injection
),即依赖注入。
所谓 IoC ,就是由 Spring IoC 容器来负责对象的生命周期和对象之间的关系
如果我们需要某个对象,一般都是采用这种直接创建的方式,这个过程复杂而又繁琐,而且我们必须要面对每个环节,而且使用完成之后我们还要复杂销毁它,这种情况下我们的对象与它所依赖的对象耦合在一起。
我们知道,我们依赖对象其实并不是依赖该对象本身,而是依赖它所提供的服务,只要在我们需要它的时候,它能够及时提供服务即可,至于它是我们主动去创建的还是别人送给我们的,其实并不是那么重要。
在没有引入 IoC 的时候,被注入的对象直接依赖于被依赖的对象,有了 IoC 后,两者及其他们的关系都是通过 Ioc Service Provider 来统一管理维护的。
- 谁控制谁:在传统的开发模式下,我们都是采用直接 new 一个对象的方式来创建对象,但是有了 IoC 容器后,则直接由 IoC 容器来控制。所以“谁控制谁”,当然是 IoC 容器控制对象
- 控制什么:控制对象。
- 为何是反转:没有 IoC 的时候我们都是在自己对象中主动去创建被依赖的对象,这是正转。但是有了 IoC 后,所依赖的对象直接由 IoC 容器创建后注入到被注入的对象中,依赖的对象由原来的主动获取变成被动接受,所以是反转。
- 哪些方面反转了:所依赖对象的获取被反转了。
如何注入
构造器注入
构造器注入,顾名思义就是被注入的对象通过在其构造方法中声明依赖对象的参数列表,让外部知道它需要哪些依赖对象
setter 方法注入
对于 JavaBean 对象而言,我们一般都是通过 getter 和 setter 方法来访问和设置对象的属性。所以,当前对象只需要为其所依赖的对象提供相对应的 setter 方法,就可以通过该方法将相应的依赖对象设置到被注入对象中。
接口方式注入
接口方式注入显得比较霸道,因为它需要被依赖的对象实现不必要的接口,带有侵入性。
Spring的核心组件
- 资源体系,Resource
- 资源加载,ResourceLoader
- 类工厂,BeanFactory
- 类描述,BeanDefinition
- 类读取,BeanDefinitionReader
- 容器,ApplicationContext
Resource
对资源的抽象。它的每一个实现类都代表了一种资源的访问策略,如 ClassPathResource、RLResource、FileSystemResource 等
类图
ResourceLoader
Spring 利用
org.springframework.core.io.ResourceLoader
来进行统一资源加载
类图
BeanFactory
是一个非常纯粹的 bean 容器,它是 IoC 必备的数据结构,其中 BeanDefinition 是它的基本结构。BeanFactory 内部维护着一个BeanDefinition map ,并可根据 BeanDefinition 的描述进行 bean 的创建和管理
类图
BeanDefinition
用来描述 Spring 中的 Bean 对象
类图
BeanDefinitionReader
org.springframework.beans.factory.support.BeanDefinitionReader
的作用是读取 Spring 的配置文件的内容,并将其转换成 Ioc 容器内部的数据结构 :BeanDefinition
类图
ApplicationContext
Spring 容器,它叫做应用上下文,与我们应用息息相关。它继承 BeanFactory ,所以它是 BeanFactory 的扩展升级版
类图