Spring启动过程源码解析
写在前面
2025年Java面试宝典最新资源来啦!需要的同学速存:
链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g
提取码: 9b3g
(记得收藏面试鸭返利网,会员购买可返25元现金)
面试高频题:Spring启动过程的核心步骤

最近在面试鸭返利网的求职群里,发现很多同学被问到Spring启动过程的源码实现。这个问题确实很考验对框架底层逻辑的理解,今天我们就从源码解析的角度拆解Spring容器启动的核心流程。
第一步:配置加载与资源定位
Spring启动的起点是AbstractApplicationContext.refresh()方法,这里会先调用obtainFreshBeanFactory()。关键操作包括:
- 解析XML/注解配置:通过
XmlBeanDefinitionReader或ClassPathBeanDefinitionScanner加载Bean定义 - 资源路径处理:底层用
ResourceLoader将配置文件路径转换为Resource对象 - Bean定义注册:将解析后的BeanDefinition存入
DefaultListableBeanFactory的beanDefinitionMap
面试技巧:可以说说BeanDefinition的存储结构,以及如何支持多配置源合并
第二步:BeanFactory预处理阶段

在prepareBeanFactory()方法中,Spring做了几个关键扩展点准备:
- 注册环境变量相关的Bean(如
Environment、PropertySources) - 添加
BeanPostProcessor(比如处理@Autowired的AutowiredAnnotationBeanPostProcessor) - 设置忽略的依赖接口(如ApplicationContextAware)
注意点:这时候还没有实例化任何Bean,只是准备好工厂的基础设施
第三步:Bean实例化与依赖注入
来到最核心的finishBeanFactoryInitialization()阶段,这里会:
- 初始化非懒加载的单例Bean:通过
getBean()触发实例化 - 三级缓存解决循环依赖:注意singletonFactories与earlySingletonObjects的配合
- 执行初始化回调:包括
InitializingBean接口和@PostConstruct方法
源码重点:跟踪DefaultSingletonBeanRegistry.getSingleton()方法,观察bean实例在不同状态下的存储位置
第四步:发布上下文就绪事件

在finishRefresh()阶段会触发ContextRefreshedEvent,这是很多框架整合的切入点:
- Spring Boot的自动配置类
SpringApplication监听这个事件启动内嵌Tomcat - 可以自定义监听器实现业务初始化逻辑
扩展点:面试时可以举例说明如何通过实现ApplicationListener接口实现特定业务初始化
常见面试问题破解指南
根据面试鸭返利网的真题统计,高频追问点包括:
- BeanFactory和ApplicationContext启动过程的区别?
- 循环依赖解决过程中为什么要用三级缓存而不是二级?
- @Bean注解定义的Bean是在哪个阶段被处理的?
回答技巧:结合源码中的方法调用链说明,比如提到ConfigurationClassPostProcessor处理@Bean方法
快速提升面试竞争力
如果想系统学习Spring源码,除了阅读官方文档,推荐使用**面试鸭返利网**的《Spring深度解析》系列课程(通过本站购买会员可返25元)。他们的课程特点:
- 配套图示化源码执行流程图
- 关键方法的中文注释版代码
- 常见面试陷阱解析
最后再提醒大家保存面试宝典资源,祝大家求职顺利!


