什么是控制反转:IoC ?
IoC 全称 Inversion Of Control
, 即控制反转。
IoC 是Spring框架最核心的特性之一。在IoC模式下,对象(组件)的创建和管理不再由对象自己负责,而是交给了IoC容器。对象只需要声明自己的依赖,IoC容器会在运行时自动将依赖注入到对象中。
什么是依赖注入:DI ?
依赖注入是控制反转的实现方式。DI允许对象通过构造函数、settler、字段等方式来接收依赖项。对象不需要自己创建、查找它们的依赖项;IoC容器在创建对象时会自动注入这些依赖项。
为什么需要 IoC/DI ?
Spring 引入IoC/DI 可以解决一下问题:
- 对象生命周期管理困难:
代码语言:javascript复制传统开发模式中,对象/组件的创建和生命周期管理都需要开发者的程序自己维护,增加了开发的难度。IoC将这部分工作交给了IoC容器,方便了对象/组件生命周期的管理。
- 代码耦合高:
代码语言:javascript复制传统开发模式中,对象/组件的创建和生命周期管理是硬编码在开发者的程序中,不同组件的代码耦合度高。不利于维护和扩展。
- 可测难度大:
代码语言:javascript复制传统开发模式中,对象/组件间依赖关系是硬编码,不易于将依赖项替换为模拟组件/对象,增加了测试难度。IoC模式则可以很容易将依赖项用模拟组件/对象替代。
- 代码可重用型低:
代码语言:javascript复制传统开发模式中,对象/组件的依赖关系是硬编码在组件内部,使得组件的可重用性较低。IoC则将一来关系抽象出来,增加了代码的可重用性。
如何使用 IoC/DI ?
Spring IoC 的实现包含以下步骤
- 配置元数据: 基于XML、基于注解、基于配置类
- 实例化IoC容器:通过
ApplicationContext
接口 - 获取Bean:
context.getBean()
IoC/DI 的实现原理
IoC/DI 底层是通过反射机制来实现的。
- 在创建Bean时,Spring IoC容器会调用Java的反射API来调用Bean的构造函数。
- 在注入依赖时,Spring IoC容器会使用Java的反射API来访问Bean的字段和方法。
Spring IoC的涉及一下步骤:
- 配置文件解析(XML、注解、配置类),加载Bean的定义信息,包括Bean的名称、类路径、依赖关系等。
- 创建Bean(含以来注入):根据Bean的定义信息,利用反射机制创建Bean对象。
- 依赖注入:利用反射机制将Bean对象所依赖的其他对象注入到当前Bean中
- Bean的使用和销毁
Spring IoC 中的关键接口/对象
在Spring框架中,IoC主要通过以下几个关键的接口或对象来实现:
BeanFactory
:这是Spring IoC容器的基础接口,它提供了配置框架和基本功能,如获取bean,检查bean是否存在,获取bean的别名等。ApplicationContext
:这是一个更高级的接口,它继承自BeanFactory接口。ApplicationContext添加了更多企业级特性,如事件发布,国际化处理,资源访问等。在大多数应用场景中,我们都会使用ApplicationContext而不是直接使用BeanFactory。BeanDefinition
:这个接口定义了一个bean的配置信息,包括bean的类名,是否是单例,依赖的bean等。在Spring的配置文件中,每一个元素就对应一个BeanDefinition对象。BeanPostProcessor
:这是一个重要的扩展点,它允许我们在bean初始化前后添加自定义的逻辑。例如,我们可以通过实现BeanPostProcessor接口,在bean初始化后进行一些额外的处理。FactoryBean
:这是一个特殊的bean,它的主要作用是产生其他bean。当一个bean的创建过程比较复杂,或者需要编程逻辑来创建时,我们可以使用FactoryBean。