从字面来理解是两个概念,IOC 和容器。
容器:
IOC容器属于 Spring core 模块,是用来创建和管理 Bean 的地方,以单例的方式存储 Bean,具体存储的地方:
DefaultListableBeanFactory 的 beanDefinitionMap
以ConcurentHashMap 的形式存储了 BeanDefinition 对象,该对象封装了 Spring 对 一个Bean 所有信息的定义,包括 类名,属性,构造方法参数,依赖,是否延迟加载,是否单例等,之后对 Bean 的操作都是直接对它进行的。
IOC容器的初始化分三个步骤:
- BeanDefinition 的资源定位
- BeanDefinition 的资源的载入和解析
- BeanDefinition 的注册
我们经常从 BeanFactory 实例化 Bean 开始说 Bean的生命周期,而 BeanFactory 就是在第二个步骤被构造出来的。
IOC:
Inversion of Control,控制反转。
我们依旧从字面来理解,控制和反转。
一般我们需要一个对象的时候,都是直接通过 new 的方式创建,这个时机是由我们把握的。也就是说我们什么时候想要这个资源,我们就主动拿,这个控制权在我们手上。现在这个控制权交给 IOC容器了,我们通过声明的方式表达我们想要的想法,但这个资源的创建和发放,都是 IOC容器控制的。
反转的概念在哪呢,Spring 框架,说到底也只不过是个工具,编译后也是以第三方包的形式存在代码中,以前都是我们使用工具包直接获取资源,现在反转了,我们能不能获取这个资源工具包说了算。
DI:
Dependency Injection,依赖注入,我们依赖 IOC容器注入资源(对象)。
DI 是 IOC容器实现控制反转的方式,有三种,这里就不详述了。
DI 是如何实现解耦的?
开发中,我们经常在 控制层 调用 业务层 接口,没有实现具体类,通过接口对象直接调业务方法。但是运行时的时候,IOC容器就动态调用了对应实现类的方法。我们只需要通过 @Autowired 注入业务的最上层接口,只关心使用,不用关心具体的业务实现。达到了解耦的效果。