吃透 Spring IoC:核心流程、Bean 生命周期与底层设计

张开发
2026/4/20 10:49:17 15 分钟阅读

分享文章

吃透 Spring IoC:核心流程、Bean 生命周期与底层设计
前言本文深入拆解 Spring IoC 容器的核心工作流程详解 BeanDefinition 的设计意义与核心结构完整梳理 Bean 从创建到销毁的全生命周期同时分析 Spring IoC 的核心扩展机制以及 BeanFactory 与 ApplicationContext 的核心区别帮助开发者从底层理解 Spring IoC 的设计思想与实现原理。一、Spring IoC 容器的核心工作流程控制反转Inversion of Control, IoC是 Spring 框架的核心设计思想其本质是将对象的创建、依赖管理、生命周期管控的控制权从业务代码转移至 Spring 容器实现业务代码与底层框架的解耦。Spring IoC 容器的核心工作流程以AnnotationConfigApplicationContext的启动过程为主线自底向上完成容器的初始化与 Bean 的批量实例化具体可分为以下六个关键步骤容器入口与构造器初始化通过new AnnotationConfigApplicationContext(AppConfig.class)创建容器实例在构造器内部完成AnnotatedBeanDefinitionReader的初始化并将配置类自身注册为容器的BeanDefinition。创建核心 Bean 工厂调用createBeanFactory()方法实例化DefaultListableBeanFactory作为整个 IoC 容器的核心底层工厂负责存储BeanDefinition元数据以及最终的单例 Bean 实例。配置解析与 BeanDefinition 加载及后处理在refresh()方法中调用invokeBeanFactoryPostProcessors()具体执行分为两个阶段1BeanDefinitionRegistryPostProcessor处理触发ConfigurationClassPostProcessor解析ComponentScan、Bean、Import等注解扫描指定包路径下的Component类并将其转换为BeanDefinition对象注册进容器。2BeanFactoryPostProcessor处理在所有BeanDefinition注册完成后调用所有注册的BeanFactoryPostProcessor实现类允许对已加载的BeanDefinition元数据进行修改或增强例如修改作用域、替换属性占位符${...}等。最终处理完毕的BeanDefinition会被统一存储在DefaultListableBeanFactory的beanDefinitionMap中等待后续实例化。注册 Bean 后置处理器执行registerBeanPostProcessors()方法扫描并提前实例化所有实现了BeanPostProcessor接口的 Bean。在此过程中会发生第一次getBean()调用例如对内置处理器internalAutowiredAnnotationProcessor的显式获取getBean(internalAutowiredAnnotationProcessor) → doGetBean (查缓存) → createBean → 执行完整的 Bean 生命周期 → 返回实例实例化后的处理器对象会被添加到容器的beanPostProcessors缓存列表中为后续普通 Bean 的初始化提供拦截增强能力。批量实例化单例 Bean执行finishBeanFactoryInitialization()方法遍历beanDefinitionNames集合中所有非懒加载的单例 Bean 定义依次调用getBean()方法触发实例化这是第二次大规模的查找/创建操作。每个 Bean 的创建过程均遵循完整的生命周期步骤查缓存singletonObjects通过createBeanInstance()使用反射getDeclaredConstructor().newInstance()完成对象实例化通过populateBean()完成属性依赖注入通过initializeBean()执行初始化回调具体顺序为执行Aware接口注入执行BeanPostProcessor.postProcessBeforeInitialization执行PostConstruct标注的方法执行BeanPostProcessor.postProcessAfterInitializationAOP 动态代理生成的关键环节。容器启动完成完成上述步骤后refresh()方法执行完毕Spring IoC 容器进入就绪状态所有单例 Bean 均已实例化并缓存于一级缓存singletonObjects中随时可供业务代码通过getBean()或依赖注入进行使用。关键数据结构与设计模式组件/模式说明DefaultListableBeanFactoryIoC 容器的核心实现包含beanDefinitionMap和singletonObjects三级缓存BeanDefinition描述 Bean 的元数据类名、作用域、是否懒加载、依赖关系等BeanPostProcessorBean 初始化前后的钩子是 AOP、依赖注入注解解析的基石工厂模式BeanFactory与ApplicationContext作为 Bean 的工厂模板方法模式refresh()定义了容器初始化的标准模板流程单例模式 三级缓存通过singletonObjects、earlySingletonObjects、singletonFactories解决循环依赖二、BeanDefinitionSpring Bean 的元数据核心2.1 为什么不能直接基于 Class 对象创建 BeanJava 原生的Class对象仅包含类的静态结构信息即编译期就已确定的内容类的全限定名、父类与实现接口、构造方法与成员方法签名、字段定义、注解与修饰符等。而 Spring 作为企业级开发框架对 Bean 的管理需要大量容器层面的动态配置信息这些信息完全无法被Class对象承载包括Bean 在容器中的唯一名称、作用域、懒加载规则、初始化与销毁方法、待注入的属性值、依赖的 Bean 列表、AOP 增强配置等。2.2 BeanDefinition 的核心定义与结构BeanDefinition是 Spring 框架中用于封装 Bean 完整元数据的顶层接口其本质是创建 Bean 实例的完整说明书整合了来自Class对象的静态类信息与 Spring 容器的动态管理配置信息。BeanDefinition的核心属性可分为两大类public interface BeanDefinition { // 1. 来自Class对象的静态类信息 String getBeanClassName(); Constructor?[] getConstructors();// 2. Spring容器专属的动态配置信息 String getBeanName(); PropertyValues getPropertyValues(); String getScope(); boolean isLazyInit(); String getInitMethodName(); String getDestroyMethodName(); // 其他扩展配置依赖关系、工厂方法、AOP配置等 }2.3 BeanDefinition 的核心设计价值职责解耦将类的静态定义与容器的管理配置完全分离实现了「类是什么」和「类在容器中如何被管理」的解耦同一个Class可在容器中注册多个不同配置的 Bean 实例。扩展支撑为 Spring 提供了 Bean 实例化前的元数据修改能力是 Spring 全流程扩展机制的核心基石。功能基础是 Spring 实现依赖注入DI、面向切面编程AOP、事务管理、生命周期回调等高级特性的底层基础。三、Bean 的完整生命周期详解Bean 的生命周期指的是 Bean 从被容器创建、属性赋值、初始化到投入业务使用最终随容器关闭被销毁的完整过程其核心流程可分为 5 个核心阶段每个阶段都对应 Spring 底层的固定执行逻辑。3.1 实例化阶段createBeanInstance核心动作Spring 容器基于BeanDefinition中记录的全限定类名通过 Java 反射机制获取类的构造方法在 JVM 堆内存中为 Bean 分配内存并创建实例对象。执行结果完成 Bean 的内存分配与实例创建此时的 Bean 仅完成了对象的实例化所有属性均为默认值基础类型为对应默认值引用类型为 null尚未完成属性注入与初始化是一个未就绪的「空对象」。3.2 属性赋值阶段该阶段为已实例化的 Bean 完成属性注入分为两个核心子步骤自定义属性注入populateBean核心动作Spring 通过反射调用 Bean 的 setter 方法完成自定义属性的赋值包括 XML 中property标签配置的属性、Autowired/Resource注解标注的依赖 Bean 注入、Value注解的配置值注入。执行结果Bean 的业务属性与依赖的 Bean 实例完成注入自定义属性具备有效值。容器感知属性注入invokeAwareMethods核心动作Spring 检测当前 Bean 是否实现了 Aware 系列接口若实现则自动调用对应的 setter 方法向 Bean 注入 Spring 容器的内部资源让 Bean 具备对容器的感知能力。核心 Aware 接口BeanNameAware注入 Bean 在容器中的唯一名称BeanClassLoaderAware注入加载该 Bean 的类加载器BeanFactoryAware注入当前的 BeanFactory 容器实例执行结果Bean 可主动获取 Spring 容器的核心资源实现与容器的深度交互。3.3 初始化阶段该阶段是 Spring 为 Bean 提供扩展增强的核心阶段即使属性赋值完成后的 Bean 在语法上已可执行Spring 仍会通过初始化阶段完成 Bean 的功能增强最终生成可投入使用的成品 Bean。该阶段分为三个核心步骤BeanPostProcessor 前置处理核心动作依次调用容器中所有注册的BeanPostProcessor的postProcessBeforeInitialization方法对 Bean 实例进行初始化前的增强处理。典型场景完成扩展 Aware 接口的回调、Bean 属性校验、资源预处理等操作。自定义初始化逻辑执行invokeInitMethods核心动作按优先级执行 Bean 的自定义初始化逻辑分为两个层级若 Bean 实现了InitializingBean接口自动调用其afterPropertiesSet方法若BeanDefinition中配置了初始化方法XML 的init-method、Bean注解的initMethod属性调用指定的自定义初始化方法。典型场景资源加载、配置初始化、数据库连接建立、缓存预热等启动前置操作。BeanPostProcessor 后置处理核心动作依次调用容器中所有注册的BeanPostProcessor的postProcessAfterInitialization方法对 Bean 实例进行初始化后的增强处理。典型场景Spring AOP 的动态代理生成、Bean 的功能包装与增强是 Spring AOP、事务管理等特性的核心实现入口。执行结果完成初始化的 Bean 是功能完整、可被直接使用的成品对象会被放入 Spring 的单例池singletonObjects中供后续业务获取与使用。3.4 使用阶段核心动作业务代码通过ApplicationContext.getBean()、Autowired等方式从容器中获取 Bean 实例调用其业务方法完成业务逻辑处理。3.5 销毁阶段核心动作当 Spring 容器关闭时对生命周期内的 Bean 执行销毁逻辑按优先级分为两个层级若 Bean 实现了DisposableBean接口自动调用其destroy方法若BeanDefinition中配置了销毁方法XML 的destroy-method、Bean注解的destroyMethod属性调用指定的自定义销毁方法。典型场景资源释放、连接池关闭、缓存清理、文件流关闭等收尾操作。3.6 【进阶】Bean生命周期11步标准流程详解为了更精确地理解 Spring 底层源码的执行时序上述 5 个阶段可进一步细化为标准的 11 步流程。该流程严格遵循「实例化 → 属性赋值 → 容器感知 → 初始化 → 销毁回调注册 → 业务使用 → 销毁」的执行顺序与 Spring 源码逻辑一一对应。实例化 Bean 对象容器通过createBeanInstance()方法基于BeanDefinition中记录的全限定类名通过反射获取类的构造方法在 JVM 堆内存中创建 Bean 的空实例。此时的 Bean 仅完成了内存分配所有属性均为 JVM 默认值基础类型为对应默认值引用类型为null未完成任何依赖注入是一个未就绪的空对象。设置对象属性容器通过populateBean()方法完成属性注入与依赖填充。处理Autowired、Resource注解标注的依赖 Bean 注入处理 XMLproperty标签、Value注解的属性赋值完成所有业务属性的有效值填充解决 Bean 之间的依赖关系。检查 Aware 相关接口并设置相关依赖容器通过invokeAwareMethods()方法检测 Bean 是否实现了 Aware 系列感知接口若实现则自动调用对应的 setter 方法向 Bean 注入 Spring 容器的内部资源如BeanNameAware、BeanClassLoaderAware、BeanFactoryAware让 Bean 具备对容器的感知能力。BeanPostProcessor 前置处理容器调用applyBeanPostProcessorsBeforeInitialization()方法依次执行所有注册的BeanPostProcessor的postProcessBeforeInitialization方法在 Bean 初始化执行前对实例进行前置增强、属性校验、资源预处理等操作。检查并执行 InitializingBean 接口方法在invokeInitMethods()方法中容器首先检测 Bean 是否实现了InitializingBean接口若实现则自动调用其afterPropertiesSet()方法执行 Spring 规范的初始化逻辑。检查并执行自定义的 init-method 方法同样在invokeInitMethods()方法中完成接口方法执行后容器检测 Bean 是否在配置中指定了自定义初始化方法XML 的init-method属性、Bean注解的initMethod属性若有则调用该自定义方法执行业务自定义的初始化逻辑。BeanPostProcessor 后置处理容器调用applyBeanPostProcessorsAfterInitialization()方法依次执行所有注册的BeanPostProcessor的postProcessAfterInitialization方法。Spring AOP 动态代理、声明式事务代理均在此步骤完成代理对象的生成最终放入容器的是增强后的代理对象而非原始实例。注册必要的 Destruction 相关回调接口容器通过registerDisposableBeanIfNecessary()方法检测 Bean 是否实现了DisposableBean接口、是否配置了自定义销毁方法若满足条件则将该 Bean 注册到容器的销毁回调列表中。这是容器关闭context.close时能够统一执行 Bean 销毁逻辑的前提是多数入门教程容易忽略的关键收尾步骤。使用中完成全流程初始化的 Bean会被放入 Spring 的单例池singletonObjects中业务代码通过Autowired依赖注入、ApplicationContext.getBean()等方式获取 Bean 实例调用其业务方法完成业务逻辑处理。检查并执行 DisposableBean 接口的销毁方法当 Spring 容器关闭时会遍历提前注册的销毁回调列表首先检测 Bean 是否实现了DisposableBean接口若实现则自动调用其destroy()方法执行 Spring 规范的销毁逻辑。检查并执行自定义的 destroy-method 方法完成接口销毁方法执行后容器检测 Bean 是否在配置中指定了自定义销毁方法XML 的destroy-method属性、Bean注解的destroyMethod属性若有则调用该自定义方法执行业务自定义的收尾、资源释放逻辑完成 Bean 的全生命周期。四、Spring IoC 的核心扩展机制Spring IoC 的核心设计优势在于其全流程可扩展的架构设计提供了两大核心扩展接口覆盖了 Bean 元数据处理与实例管理的全流程是 Spring 能够适配各类企业级开发场景的核心原因。4.1 BeanFactoryPostProcessorBeanDefinition 级别的扩展执行时机BeanDefinition加载完成后Bean 实例化之前核心作用对容器中已加载的BeanDefinition元数据进行修改、新增、删除操作直接干预 Bean 的创建规则不会影响后续 Bean 的实例化流程。典型实现PropertySourcesPlaceholderConfigurer用于将BeanDefinition中的配置占位符如${jdbc.username}替换为配置文件中的实际值。执行特性可注册多个实现类通过Ordered接口控制执行顺序在容器启动时统一执行。4.2 BeanPostProcessorBean 实例级别的扩展执行时机Bean 实例化与属性赋值完成后在初始化阶段的前后分别执行核心作用对已创建的 Bean 实例进行修改、包装、增强干预 Bean 的初始化流程是 Spring AOP、动态代理、事务管理等核心特性的实现基础。核心方法postProcessBeforeInitialization初始化前置处理postProcessAfterInitialization初始化后置处理执行特性容器中所有 Bean 的初始化流程都会经过该处理器的处理可通过条件判断实现对特定 Bean 的定向增强。五、BeanFactory 与 ApplicationContext 的区别与联系5.1 核心联系BeanFactory是 Spring IoC 容器的顶层核心接口定义了容器最基础的核心能力获取 Bean 实例、管理 Bean 生命周期、判断 Bean 状态、维护 Bean 依赖关系是 Spring IoC 容器的底层实现。ApplicationContext是BeanFactory的子接口完全继承了BeanFactory的所有核心能力并在此基础上扩展了大量企业级开发所需的高级特性。5.2 核心区别特性维度BeanFactoryApplicationContext核心定位底层容器接口仅提供 Bean 管理的核心基础能力高级容器接口面向企业级开发的全功能容器加载策略懒加载模式仅在首次调用getBean()时才会实例化对应 Bean预加载模式容器启动时就完成所有单例 Bean 的实例化与初始化扩展功能仅支持基础的 Bean 生命周期管理支持事件发布、国际化处理、统一资源加载、AOP 集成、事务管理、环境配置管理等企业级特性适用场景资源受限的环境如移动端、嵌入式设备常规 JavaEE 企业级开发场景是日常开发中默认使用的 Spring 容器六、结语Spring IoC 的核心设计思想是通过BeanDefinition实现类的静态定义与容器管理配置的解耦通过全生命周期的扩展点提供极致的架构扩展性通过分层的容器接口实现基础能力与高级特性的分离。理解 Spring IoC 的核心原理与 Bean 的生命周期不仅能帮助开发者在日常开发中规避 Spring 使用的常见问题更能基于 Spring 的扩展机制实现自定义的业务组件充分发挥 Spring 框架的架构优势。

更多文章