配置加载 → Bean定义注册 → BeanFactoryPostProcessor增强
↓
实例化 → 三级缓存 → 属性填充 → Aware接口回调
↓
初始化前处理 → @PostConstruct → afterPropertiesSet → init-method → 初始化后处理(AOP代理)
↓
一级缓存 → 业务使用 → 容器关闭 → @PreDestroy → destroy()
一、配置加载与 Bean 定义注册
资源定位与解析
Spring 通过 ResourceLoader 加载配置文件(XML、YAML 或注解配置)。
使用 BeanDefinitionReader(如 XmlBeanDefinitionReader 或 AnnotatedBeanDefinitionReader)解析配置,生成 BeanDefinition 对象。
BeanDefinition 注册
将 BeanDefinition 注册到 BeanDefinitionRegistry(如 DefaultListableBeanFactory 的 beanDefinitionMap)。
BeanFactory 增强
调用 BeanFactoryPostProcessor 实现类(如 PropertySourcesPlaceholderConfigurer),修改 BeanDefinition 的属性值(如占位符替换)。
二、Bean 实例化与初始化
实例化阶段
触发时机:
调用 BeanFactory.getBean() 时,进入 AbstractAutowireCapableBeanFactory.doCreateBean()。
实例化方式:通过反射(默认)、工厂方法或构造器生成对象。
三级缓存机制:
实例化后,将 ObjectFactory(Lambda 表达式)存入 三级缓存(singletonFactories)。
若存在循环依赖,通过 getEarlyBeanReference() 提前生成代理对象,存入 二级缓存(earlySingletonObjects)。
属性填充与依赖注入:
populateBean():通过反射或 Setter 方法注入属性值,若依赖其他 Bean,递归调用 getBean()。
循环依赖解决:
通过三级缓存暴露早期引用,避免无限递归。
初始化阶段
Aware 接口回调:
调用 BeanNameAware、BeanFactoryAware、ApplicationContextAware 等接口方法。
@PostConstruct → 2. InitializingBean.afterPropertiesSet() → 3. init-method
初始化前处理:
执行 BeanPostProcessor.postProcessBeforeInitialization()(如 @PostConstruct 注解方法)。
初始化方法调用:
执行 InitializingBean.afterPropertiesSet() 或自定义 init-method。
初始化后处理:
执行 BeanPostProcessor.postProcessAfterInitialization()(如生成 AOP 代理对象)。
缓存升级:
将最终 Bean(代理对象或原始对象)存入 一级缓存(singletonObjects),删除二、三级缓存。
三、Bean 使用与销毁
使用阶段:
通过 ApplicationContext.getBean() 获取完全初始化的 Bean,供业务逻辑调用。
销毁阶段:
容器关闭触发:调用 ApplicationContext.close() 或注册 JVM 关闭钩子。
销毁方法执行:
调用 @PreDestroy 注解方法 → DisposableBean.destroy() → 自定义 destroy-method。
作用域差异:
Singleton:由 Spring 管理完整生命周期。
Prototype:Spring 仅负责实例化,销毁由调用方处理。
四、关键机制补充
AOP 代理生成时机
循环依赖时:在 getEarlyBeanReference() 中提前生成代理。
初始化后:在 postProcessAfterInitialization() 中生成最终代理。
缓存作用总结
三级缓存:延迟生成早期引用,解决循环依赖。
二级缓存:缓存已生成但未初始化的代理对象。
一级缓存:存储完整的单例 Bean。