千家信息网

spring之IOC的主干流程是什么

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容主要讲解"spring之IOC的主干流程是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"spring之IOC的主干流程是什么"吧!前言最近写的
千家信息网最后更新 2026年11月01日spring之IOC的主干流程是什么

本篇内容主要讲解"spring之IOC的主干流程是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"spring之IOC的主干流程是什么"吧!

前言

最近写的几篇spring系列的文章,收到了很多读者的好评,有些读者希望我再多写几篇这方面的文章。甚至还有读者私信给我,向我请教看spring源码的方法,为此我打算写一个spring源码解读的系列,回馈给一直支持我的粉丝们。

不知道你有没有这些经历:

  • 想看spring的源码无从下手

  • spring源码太多,看着看着就跟丢了

  • 不知道哪些是主要的,哪些是次要的

  • 前几天还记得,今天就忘了

spring源码很复杂,说实话这类文章不好写,想把它讲清楚很难,写着写着篇幅会很长,读者不一定有耐心看下去,而且看完容易忘记。

我打算用图文相结合的方式,去除糟粕,只解读一些精华部分,给读者们在阅读源码时一个清晰的思路,不至于迷路。另外最关键的是,看完之后可以记住很多关键流程。

在spring的庞大体系中,IOC(控制反转)贯穿始终,其作用不言而喻。我们就先从IOC开始,介绍它的主干流程,给有需要的朋友一些指引。

入口

spring容器的顶层接口是:BeanFactory,但我们使用更多的是它的子接口:ApplicationContext。

通常情况下,如果我们想要手动初始化通过xml文件配置的spring容器时,代码是这样的:

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); User user = (User)applicationContext.getBean("name");

如果想要手动初始化通过配置类配置的spring容器时,代码是这样的:

AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class); User user = (User)applicationContext.getBean("name");

这两个类应该是最常见的入口了,它们却殊途同归,最终都会调用refresh方法,该方法才是spring容器初始化的真正入口。

顺便提一下,其实调用refresh方法的类并非只有这两个,我们用一张图整体认识一下:

虽说调用refresh方法的类有这么多,但我决定用ClassPathXmlApplicationContext类作为列子给大家讲解,因为它足够经典,而且难度相对来说要小一些。

再次重申一下,由于spring源码代码量巨大,即使我能一次性讲完,恐怕你也没那么多耐心看下去。所以我会采用你好,我也好的方式,忽略一些细枝末节,只抓重点。如果有对某些细节比较感兴趣的同学,欢迎加我微信和我一起交流,或者关注我后续的文章,将会做详细的讲解。

refresh方法r

efresh方法是spring ioc的真正入口,它负责初始化spring容器。

既然这个方法的作用是初始化spring容器,那方法名为啥不叫init?

答案很简单,因为它不只被调用一次。

在springboot的SpringAppication类中的run方法会调用refreshContext方法,该方法会调用一次refresh方法。

在springcloud的BootstrapApplicationListener类中的onApplicationEvent方法会调用SpringAppication类中的run方法。也会调用一次refresh方法。

这是springboot项目中如果引入了springcloud,则refresh方法会被调用两次的原因。

在springmvc的FrameworkServlet类中的initWebApplicationContext方法会调用configureAndRefreshWebApplicationContext方法,该方法会调用一次refresh方法,不过会提前判断容器是否激活。

所以这里的refresh表示重新构建的意思。

好了,废话不多说。下面重点看看refresh的关键步骤:

其实上图中一眼看过去好像有很多方法,但是真正的核心的方法不多,我主要讲其中最重要的:

  • obtainFreshBeanFactory

  • invokeBeanFactoryPostProcessors

  • registerBeanPostProcessors

  • finishBeanFactoryInitialization

解析xml配置文件obtainFreshBeanFactory方法会解析xml的bean配置,生成BeanDefinition对象,并且注册到spring容器中(说白了就是很多map集合中)。

经过几层调用(细节不说,很简单),会调到AbstractBeanDefinitionReader类的loadBeanDefinitions方法:

该方法会循环locations(applicationContext.xml文件路径),调用另外一个loadBeanDefinitions方法,一个文件一个文件解析。

经过一些列的骚操作,会将location转换成inputSource和resource,然后再转换成Document对象,方面解析。

在解析xml文件时,需要判断是默认标签,还是自定义标签,处理逻辑不一样:

spring的默认标签只有4种:

对应的处理方法是:

注意常见的:、、等都是自定义标签。

从上图中处理标签的processBeanDefinition方法开始,经过一系列调用,最终会调到DefaultBeanDefinitionDocumentReader类的processBeanDefinition方法。

这个方法包含了关键步骤:解析元素生成BeanDefinition 和 注册BeanDefinition。

自定义属性的内容有趣,但是不这里不会讲,现在用得不多,有兴趣的同学加我微信和我私聊。

生成BeanDefinition

下面重点看看BeanDefinition是如何生成的。

上面的方法会调用BeanDefinitionParserDelegate类的parseBeanDefinitionElement方法:

一个标签会对应一个BeanDefinition对象。

该方法又会调用同名的重载方法:processBeanDefinition,真正创建BeanDefinition对象,并且解析一系列参数填充到对象中:

其实真正创建BeanDefinition的逻辑是非常简单的,直接new了一个对象:

真正复杂的地方是在前面的各种属性的解析和赋值上。

注册BeanDefinition

上面通过解析xml文件生成了很多BeanDefinition对象,下面就需要把BeanDefinition对象注册到spring容器中,这样spring容器才能初始化bean。

在BeanDefinitionReaderUtils类的registerBeanDefinition方法很简单,只有两个流程:

先看看DefaultListableBeanFactory类的registerBeanDefinition方法是如何注册beanName的:

接下来看看SimpleAliasRegistry类的registerAlias方法是如何注册alias别名的:

这样就能通过多个不同的alias找到同一个name,再通过name就能找到BeanDefinition。

修改BeanDefinition

上面BeanDefinition对象已经注册到spring容器当中了,接下来,如果想要修改已经注册的BeanDefinition对象该怎么办呢?

refresh方法中通过invokeBeanFactoryPostProcessors方法修改BeanDefinition对象。

经过一系列的调用,最终会到PostProcessorRegistrationDelegate类的invokeBeanFactoryPostProcessors方法:

流程看起来很长,其实逻辑比较简单,主要是在处理BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor。

而BeanDefinitionRegistryPostProcessor本身是一种特殊的BeanFactoryPostProcessor,它也会执行BeanFactoryPostProcessor的逻辑,只是加了一个额外的方法。

ConfigurationClassPostProcessor可能是最重要的BeanDefinitionRegistryPostProcessor,它负责处理@Configuration注解。

注册BeanPostProcessor

处理完前面的逻辑,refresh方法接着会调用registerBeanPostProcessors注册BeanPostProcessor,它的功能非常强大,后面的文章会详细讲解。

经过一系列的调用,最终会到PostProcessorRegistrationDelegate类的registerBeanPostProcessors方法:

注意,这一步只是注册BeanPostProcessor,真正的使用在后面。

到此,相信大家对"spring之IOC的主干流程是什么"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

方法 容器 对象 流程 文件 源码 标签 处理 文章 读者 逻辑 生成 配置 主干 入口 关键 两个 代码 兴趣 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 新华互联网科技 上海卓越科技互联网 互联网科技工作委员会副主任毛军 中国互联网科技工作委员会毛军 河南真二互联网科技有限公司 互联网巨头反垄断金融科技 互联网为科技 互联网与新科技 互联网科技素材视频竖屏 深圳卡尔迅互联网科技有限公司怎么样 汉立互联网科技有限公司联系电话 互联网之后的科技是什么 互联网金融中的现代科技 湖北码尼互联网科技有限公司电话 世界互联网科技公司市值排名 新兴科技互联网创新大赛颁奖典礼 玉溪互联网科技怎么选 南通创西澳互联网科技有限公司 东营紫格互联网科技 科技互联网行业投资研究 科技企业和互联网企业 苏州大垚互联网科技 科技赋能互联网健康 江苏南京365互联网科技 深圳前海聚择互联网科技有限公司 亳州好赞互联网科技有限公司 上海互联网科技公司ppt 万物互联网智能科技 好易买互联网科技 重庆科技产业互联网有哪些
0