Spring IOC的工作流程并谈谈对IOC的理解

IOC的定义

IOC的全称叫Inversion Of Control, 也就是控制反转。它的核心思想是把对象的管理权限交给了容器

在这里插入图片描述
在这里插入图片描述
应用程序如果需要使用某个对象的实例,那么直接从IOC容器里面去获取就可以了。

那么这种设计的好处在于降低了程序里面对象与对象之间的耦合性,使得程序的整个体系结构变得更加灵活。

Bean的声明方式

Spring里面提供了很多方式去声明一个Bean,比如说在XML配置文件里面。通过<bean>的标签或者通过@Service注解或者通过@Configuration配置类里面通过@Bean注解去声明等等。

在这里插入图片描述

那么Spring在启动的时候,会去解析这些bean,然后保存到IOC容器里面。

IOC的工作流程

1. IOC容器的初始化阶段

这个阶段主要是根据程序里面定义的XML或者注解等Bean的声明方式通过解析和加载后生成BeanDefinition,然后把BeanDefinition注册到IOC容器里面。

通过注解或者xml声明的bean都会解析得到一个BeanDefinition实体。这个实体里面会包含bean的一些定义和基本的一些属性。最后会把这个BeanDefinition保存到一个Map集合里面,从而去完成IOC的一个初始化。

IOC容器的作用就是对这些注册的Bean的定义信息进行处理和维护。它是IOC控制反转的一个核心。

2. 完成Bean初始化及依赖注入

这个阶段会做两个事情。
在这里插入图片描述
第一个是通过反射去针对没有设置lazy-init属性的单例bean进行初始化。

【补充】该句话的含义是在Spring容器中,如果一个单例(singleton)的bean没有设置lazy-init属性(懒加载),那么在容器启动时就会立即实例化该bean,并将其放入容器中。此时,如果我们使用反射技术获取该bean的实例对象,Spring容器会检测到该bean还没有完成初始化,会自动触发其初始化方法以完成实例化。因此,我们可以通过反射获取该单例bean的实例对象,并保证其已经完成了初始化。

第二个是完成Bean的依赖注入。

3. Bean的使用

在这里插入图片描述
通常我们会通过@Autowired这样一个注解或者通过BeanFactory.getBean()从IOC容器里面去获取一个指定的bean的实例。

另外针对设置了lazy-init属性以及非单例bean的一个实例化,是在每一次获取bean对象的时候,调用bean的初始化方法来完成实例化的。并且Spring IOC容器不会去管理这些Bean。

官网中的定义

IOC与大家熟知的依赖注入同理,这是一个通过依赖注入对象的过程,也就是说,它们所使用的对象,是通过构造函数参数、工厂方法的参数或者是从工厂方法的构造函数或返回值的对象实例设置的属性,然后容器在创建bean时注入这些需要的依赖。

这个过程相对普通创建对象的过程是反向的(因此称之为IoC),bean本身通过直接构造类来控制依赖关系的实例化或位置,或提供诸如服务定位器模式之类的机制。

如果这个过程比较难理解的话,那么可以想象自己找女朋友和婚介公司找女朋友的过程。如果这个过程能够想明白的话,那么我们现在回答上面的问题:

  1. 谁控制谁:在之前的编码过程中,都是需要什么对象自己去创建什么对象,由程序员自己来控制对象,而有了IOC容器之后,就变成由IOC容器来控制对象
  2. 控制什么:在实现过程中所需要的对象需要依赖的对象
  3. 什么是反转:在没有IOC容器之前我们都是在对象中主动去创建依赖的对象,这是正转的,而有了IOC之后,依赖的对象直接由IOC容器创建后注入到对象中,由主动创建变成了被动接受,这是反转。
  4. 哪些方面被反转:依赖的对象, 把对象的管理权限交给了容器

参考资料:

  1. Spring面试必问:说说你对IOC的理解
  2. 资深架构师带你用教科书的方式回答,请你介绍下Spring IoC的工作流程
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring IOC(控制反转)是Spring框架的核心特性之一,它通过管理对象的创建和依赖注入,实现了对象之间的解耦和灵活性。下面是Spring IOC工作流程: 1. 配置:首先,您需要创建一个 Spring 配置文件,通常是 XML 格式的。这个配置文件中包含了Spring容器需要了解的关于对象的定义和配置信息,比如对象的类名、依赖关系、属性值等。 2. 加载:Spring IOC 容器负责加载和解析配置文件,读取配置信息并创建相应的对象。 3. 实例化:Spring IOC 容器根据配置文件中的定义,使用反射机制实例化对象。这些对象被称为 Spring Bean。 4. 依赖注入:一旦对象被实例化,Spring IOC 容器会检查对象的依赖关系,并自动将依赖的对象注入到相应的属性中。这种依赖注入可以通过构造函数、Setter 方法或字段注入来完成。 5. 生命周期管理:Spring IOC 容器管理 Spring Bean 的生命周期。它会在适当的时候调用初始化方法和销毁方法,以确保对象被正确地创建和销毁。 6. 提供 Bean:一旦所有的对象都被创建和初始化,Spring IOC 容器就可以提供这些对象给其他的应用程序组件使用了。 通过这个工作流程Spring IOC 实现了对象的解耦和灵活性。开发人员只需要关注对象的定义和配置,而不需要显式地创建和管理对象。这样可以提高代码的可维护性、可测试性和可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值