Spring学习笔记 | 控制反转IoC与依赖注入DI

2024-04-30 15:57:05 浏览数 (3)

什么是控制反转: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 的实现包含以下步骤

  1. 配置元数据: 基于XML、基于注解、基于配置类
  2. 实例化IoC容器:通过ApplicationContext接口
  3. 获取Bean:context.getBean()

IoC/DI 的实现原理

IoC/DI 底层是通过反射机制来实现的。

  • 在创建Bean时,Spring IoC容器会调用Java的反射API来调用Bean的构造函数。
  • 在注入依赖时,Spring IoC容器会使用Java的反射API来访问Bean的字段和方法。

Spring IoC的涉及一下步骤:

  1. 配置文件解析(XML、注解、配置类),加载Bean的定义信息,包括Bean的名称、类路径、依赖关系等。
  2. 创建Bean(含以来注入):根据Bean的定义信息,利用反射机制创建Bean对象。
  3. 依赖注入:利用反射机制将Bean对象所依赖的其他对象注入到当前Bean中
  4. Bean的使用和销毁

Spring IoC 中的关键接口/对象

在Spring框架中,IoC主要通过以下几个关键的接口或对象来实现:

  1. BeanFactory:这是Spring IoC容器的基础接口,它提供了配置框架和基本功能,如获取bean,检查bean是否存在,获取bean的别名等。
  2. ApplicationContext:这是一个更高级的接口,它继承自BeanFactory接口。ApplicationContext添加了更多企业级特性,如事件发布,国际化处理,资源访问等。在大多数应用场景中,我们都会使用ApplicationContext而不是直接使用BeanFactory。
  3. BeanDefinition:这个接口定义了一个bean的配置信息,包括bean的类名,是否是单例,依赖的bean等。在Spring的配置文件中,每一个元素就对应一个BeanDefinition对象。
  4. BeanPostProcessor:这是一个重要的扩展点,它允许我们在bean初始化前后添加自定义的逻辑。例如,我们可以通过实现BeanPostProcessor接口,在bean初始化后进行一些额外的处理。
  5. FactoryBean:这是一个特殊的bean,它的主要作用是产生其他bean。当一个bean的创建过程比较复杂,或者需要编程逻辑来创建时,我们可以使用FactoryBean。

0 人点赞