Spring源码全套连载系列持续更新前三篇我们铺垫完了Spring架构、IoCDI思想、容器顶层架构彻底搞懂了BeanFactory和ApplicationContext的区别。从本篇开始正式进入Spring源码最核心、最硬核、面试必考的内容refresh() 容器刷新方法。毫不夸张的说吃透了 refresh()就吃透了80%的Spring IoC源码。很多人看源码卡在这一步流程太长、步骤太多、看不懂每一步的意义、分不清主次。今天我带大家逐行断点、逐步骤拆解refresh() 的12大核心流程区分哪些是铺垫操作、哪些是核心重点帮你彻底打通Spring容器启动全链路告别死记硬背一、前言为什么refresh()是Spring的灵魂我们在上一篇演示了注解容器启动代码new AnnotationConfigApplicationContext(SpringConfig.class);跟进源码可以发现整个Spring容器的创建、Bean扫描、解析、实例化、初始化、后置处理全部都在 refresh() 方法中完成。它是Spring IoC容器的总调度入口是整个Spring框架的启动引擎。所有Spring源码的核心流程BeanDefinition解析、后置处理器执行、Bean生命周期、循环依赖、AOP代理创建全部嵌套在refresh()的12个步骤中。本篇我们基于AnnotationConfigApplicationContext注解容器完整拆解刷新流程。二、refresh()方法整体总览refresh() 方法位于AbstractApplicationContext中是一个模板方法一共固定12大执行步骤顺序严格固定缺一不可。先贴出完整原生源码建立整体认知Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // 1.刷新前预处理 prepareRefresh(); // 2.获取Bean工厂 ConfigurableListableBeanFactory beanFactory obtainFreshBeanFactory(); // 3.预处理Bean工厂 prepareBeanFactory(beanFactory); // 4.Bean工厂后置处理空方法子类拓展 postProcessBeanFactory(beanFactory); // 5.执行Bean工厂后置处理器解析配置类、扫描Bean invokeBeanFactoryPostProcessors(beanFactory); // 6.注册Bean后置处理器 registerBeanPostProcessors(beanFactory); // 7.初始化国际化资源 initMessageSource(); // 8.初始化事件广播器 initApplicationEventMulticaster(); // 9.容器刷新拓展钩子空方法子类实现 onRefresh(); // 10.注册事件监听器 registerListeners(); // 11.核心实例化所有非懒加载单例Bean finishBeanFactoryInitialization(beanFactory); // 12.刷新完成收尾发布容器刷新事件 finishRefresh(); } }接下来我们逐个步骤、由浅入深讲解区分【了解即可】和【核心重点】模块帮你精准抓考点。三、refresh()十二步骤逐行深度拆解1、prepareRefresh() —— 容器刷新前置准备【了解】这是容器刷新的第一步做一些初始化前置铺垫操作无核心业务逻辑。核心操作记录容器启动时间设置容器激活状态初始化环境变量、属性配置校验清空容器缓存资源一句话总结容器开机初始化准备好运行环境。2、obtainFreshBeanFactory() —— 获取全新Bean工厂【次重点】该步骤会刷新并获取一个全新的BeanFactory容器工厂。核心操作刷新Bean工厂状态设置序列化ID返回DefaultListableBeanFactory核心工厂对象关键知识点DefaultListableBeanFactory是Spring底层唯一真正的Bean工厂实现类集所有功能于一身是存储Bean定义、Bean实例的核心容器。3、prepareBeanFactory(beanFactory) —— Bean工厂预处理【次重点】对刚获取的Bean工厂进行基础环境填充与配置为后续Bean解析做准备。核心操作设置类加载器、表达式解析器、属性编辑器配置Bean工厂的上下文、环境参数注册Spring内置的环境Beanenvironment、systemProperties等设置依赖注入忽略接口Aware系列接口无需手动注入一句话总结给Bean工厂配齐工具、环境、内置资源。4、postProcessBeanFactory(beanFactory) —— 工厂后置拓展【了解】这是一个空的模板方法Spring本身不实现任何逻辑。作用留给子类拓展Web环境下的Spring容器会在此处拓展Web专属Bean工厂配置。5、invokeBeanFactoryPostProcessors(beanFactory) —— 执行工厂后置处理器【超级核心】这是refresh()第一个超级核心步骤整个Spring的配置类解析、包扫描、BeanDefinition注册全部在这一步完成。很多人疑惑ComponentScan、Bean、Configuration是怎么生效的答案就在这一步核心执行逻辑Spring获取所有BeanFactoryPostProcessor工厂后置处理器重点执行ConfigurationClassPostProcessor配置类后置处理器解析主配置类扫描指定包下所有带注解的组件解析Bean、Import、PropertySource等注解将所有扫描到的类封装为BeanDefinition存入Bean工厂核心产出此时容器中所有Bean的定义信息已全部加载完成但是还没有创建任何Bean实例面试必考BeanDefinition的注册时机在invokeBeanFactoryPostProcessors阶段完成。6、registerBeanPostProcessors(beanFactory) —— 注册Bean后置处理器【核心】注意区分两个后置处理器90%面试者都会混淆BeanFactoryPostProcessor作用于Bean工厂修改Bean定义执行时机早BeanPostProcessor作用于Bean实例增强Bean对象执行时机晚本步骤核心作用扫描、排序、注册所有Bean后置处理器存入容器集合为后续Bean实例化、初始化、AOP代理做准备。经典后置处理器AutowiredAnnotationBeanPostProcessor处理Autowired自动注入CommonAnnotationBeanPostProcessor处理Resource、PostConstruct等注解AnnotationAwareAspectJAutoProxyCreatorAOP代理创建核心处理器7、initMessageSource() —— 初始化国际化资源【了解】初始化容器国际化资源处理器支持多语言配置日常业务开发极少用到只需了解即可。8、initApplicationEventMulticaster() —— 初始化事件广播器【了解】初始化Spring容器的事件发布广播器为后续容器事件、自定义事件发布提供能力支撑。9、onRefresh() —— 容器刷新钩子【了解】空模板方法无默认实现。Web容器SpringBoot会重写该方法启动内嵌Tomcat容器。10、registerListeners() —— 注册事件监听器【了解】将容器中所有实现了监听器接口的Bean注册到事件广播器监听容器各类事件。11、finishBeanFactoryInitialization(beanFactory) —— 实例化单例Bean【终极核心】整个Spring最最最重要的一步没有之一前面所有步骤都是铺垫这一步才是真正干活的核心核心功能完成所有非懒加载、非抽象、单例Bean的实例化、依赖注入、初始化、代理创建、存入单例池。我们后续要讲的所有核心源码全部源自这一步Bean完整生命周期流程三级缓存解决循环依赖Autowired自动注入原理Bean初始化前后置处理AOP动态代理对象创建执行链路遍历所有BeanDefinition - 满足条件则创建Bean - 填充属性 - 初始化 - 代理增强 - 放入单例池12、finishRefresh() —— 容器刷新收尾【次重点】容器启动最后一步做收尾工作初始化容器生命周期处理器发布ContextRefreshedEvent容器刷新完成事件标记容器启动完成状态至此整个Spring IoC容器启动彻底完成四、12步骤核心权重分级学习避坑为了方便大家高效复习、面试突击我把12个步骤分为三个等级精准抓重点 顶级核心必须吃透、面试必考步骤5invokeBeanFactoryPostProcessors解析Bean定义 步骤11finishBeanFactoryInitialization创建Bean实例⭐ 次级核心需要理解、高频提问步骤2获取Bean工厂 步骤3工厂预处理 步骤6注册Bean后置处理器 步骤12容器收尾刷新 了解即可极少提问步骤1、4、7、8、9、10五、超关键总结Bean定义 VS Bean实例看完12步流程必须理清一个核心区别90%初学者都会混淆前10步结束容器中只有BeanDefinitionBean定义信息只有类的元数据没有创建任何对象不占堆内存第11步执行后容器才通过反射创建对象、完成赋值、初始化生成真正的Bean实例存入单例池一句话终极总结refresh流程先解析定义后创建实例先处理工厂后初始化Bean。六、高频面试题满分答案本篇专属1、refresh()方法的作用refresh()是Spring容器刷新的核心模板方法是IoC容器启动的总入口通过12个固定步骤完成Bean工厂初始化、Bean定义解析、后置处理器注册、单例Bean实例化、容器初始化收尾等全套操作最终完成Spring IoC容器的完整启动。2、BeanDefinition是在什么时候注册的在refresh()的invokeBeanFactoryPostProcessors步骤通过ConfigurationClassPostProcessor配置类后置处理器完成包扫描、注解解析将所有组件封装为BeanDefinition注册到容器。3、Bean实例是什么时候创建的在refresh()的finishBeanFactoryInitialization步骤统一实例化所有非懒加载的单例Bean完成依赖注入与初始化。4、BeanFactoryPostProcessor和BeanPostProcessor的区别BeanFactoryPostProcessor执行时机更早作用于Bean工厂用于解析注册Bean定义BeanPostProcessor执行时机更晚作用于Bean实例用于对Bean对象进行增强处理。七、本篇总结amp;下期预告本篇总结本篇我们完整拆解了Spring容器最核心的refresh()十二大流程彻底打通了容器启动全链路掌握了refresh()整体执行逻辑与模板设计思想分清了每个步骤的职责、权重与学习重点理清了Bean定义注册与Bean实例创建的时机差异吃透了两大后置处理器的核心区别与执行时机下期预告下一篇我们聚焦步骤5核心细节深度拆解BeanDefinition源码详解Spring如何描述一个Bean带你搞懂Spring是如何解析类、封装Bean元数据、完成Bean注册的底层逻辑 往期推荐 系列连载本系列持续更新全程干货无水文关注我带你从零吃透Spring源码彻底搞定面试底层原理