深度剖析Spring Bean生命周期:从创建到销毁的全过程解析
创作时间:
作者:
@小白创作中心
深度剖析Spring Bean生命周期:从创建到销毁的全过程解析
引用
CSDN
1.
https://blog.csdn.net/m0_61715294/article/details/146727374
Spring框架中的Bean生命周期管理是其核心功能之一,从Bean的创建到销毁,Spring提供了丰富的扩展机制和灵活的控制手段。本文将从源码层面深入解析Bean生命周期的各个阶段,帮助开发者全面掌握这一重要知识点。
一、Bean生命周期全景图
二、核心阶段源码级解析
2.1 Bean实例化流程
在AbstractAutowireCapableBeanFactory
类的doCreateBean
方法中,可以清晰地看到Bean实例化的主要步骤:
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
// 1. 实例化
BeanWrapper instanceWrapper = createBeanInstance(beanName, mbd, args);
// 2. 属性填充
populateBean(beanName, mbd, instanceWrapper);
// 3. 初始化
Object exposedObject = initializeBean(beanName, exposedObject, mbd);
return exposedObject;
}
2.2 初始化流程详解
在AbstractAutowireCapableBeanFactory
类的initializeBean
方法中,详细展示了Bean初始化的各个步骤:
protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
// 调用Aware接口
invokeAwareMethods(beanName, bean);
// 前置处理
Object wrappedBean = applyBeanPostProcessorsBeforeInitialization(bean, beanName);
// 初始化方法
invokeInitMethods(beanName, wrappedBean, mbd);
// 后置处理
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
return wrappedBean;
}
三、关键扩展点深度剖析
3.1 BeanPostProcessor执行顺序
3.2 典型处理器实现
处理器 | 作用 | 典型应用 |
---|---|---|
CommonAnnotationBeanPostProcessor | 处理@PostConstruct/@PreDestroy | JSR-250标准注解支持 |
AutowiredAnnotationBeanPostProcessor | 处理@Autowired/@Value | 依赖注入实现 |
ApplicationContextAwareProcessor | 注入ApplicationContext等容器对象 | 获取容器资源 |
AbstractAutoProxyCreator | AOP代理创建 | Spring AOP实现基础 |
四、完整生命周期回调示例
4.1 生命周期Bean实现
public class LifecycleBean implements BeanNameAware, ApplicationContextAware, InitializingBean, DisposableBean {
@PostConstruct
public void customInit() {
System.out.println("@PostConstruct方法执行");
}
@PreDestroy
public void customDestroy() {
System.out.println("@PreDestroy方法执行");
}
@Override
public void afterPropertiesSet() {
System.out.println("InitializingBean.afterPropertiesSet()执行");
}
@Override
public void destroy() {
System.out.println("DisposableBean.destroy()执行");
}
@Override
public void setBeanName(String name) {
System.out.println("BeanNameAware.setBeanName()执行: " + name);
}
@Override
public void setApplicationContext(ApplicationContext ctx) {
System.out.println("ApplicationContextAware.setApplicationContext()执行");
}
}
4.2 XML配置示例
五、特殊场景处理机制
5.1 循环依赖解决流程
5.2 作用域扩展支持
作用域 | 初始化时机 | 销毁管理 |
---|---|---|
singleton | 容器启动时 | 容器关闭时 |
prototype | 每次getBean时 | 不管理销毁 |
request | 每个HTTP请求 | 请求结束 |
session | 每个会话创建时 | 会话失效 |
application | ServletContext生命周期 | ServletContext销毁时 |
六、生命周期管理最佳实践
6.1 初始化顺序控制
@Configuration
public class LifecycleConfig {
@Bean(initMethod = "init")
@DependsOn("databaseInitializer")
public ServiceBean serviceBean() {
return new ServiceBean();
}
@Bean
public DatabaseInitializer databaseInitializer() {
return new DatabaseInitializer();
}
}
6.2 安全销毁资源方案
public class ResourceHolder implements DisposableBean {
private final List<Connection> connections = new ArrayList<>();
public void addConnection(Connection conn) {
connections.add(conn);
}
@Override
public void destroy() {
connections.forEach(conn -> {
try {
if (!conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
log.error("连接关闭失败", e);
}
});
}
}
七、常见问题排查指南
问题现象 | 可能原因 | 解决方案 |
---|---|---|
@PostConstruct未执行 | 未启用注解驱动 | 添加context:annotation-config |
Bean未正常销毁 | prototype作用域未手动销毁 | 实现DisposableBean接口 |
循环依赖初始化失败 | 构造函数注入循环依赖 | 改用setter注入 |
Aware接口未生效 | 未配置ApplicationContextAwareProcessor | 检查BeanPostProcessor配置 |
初始化顺序不可控 | 依赖关系未明确 | 使用@DependsOn注解 |
八、源码级调试技巧
8.1 关键断点设置
AbstractApplicationContext.refresh()
DefaultSingletonBeanRegistry.getSingleton()
AbstractAutowireCapableBeanFactory.createBean()
InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization()
8.2 生命周期事件监听
public class LifecycleListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
System.out.println("容器初始化完成");
}
}
总结与展望
通过本文的深度解析,我们完整梳理了Spring Bean生命周期的各个阶段及其扩展机制。掌握这些知识点可以帮助我们:
- 精准控制Bean初始化顺序
- 合理管理资源分配与释放
- 高效排查Bean生命周期相关故障
- 灵活扩展Spring容器功能
进阶学习建议:
- 阅读Spring Framework源码的Bean生命周期相关模块
- 研究不同作用域Bean的管理机制
- 探索Spring Boot自动配置与Bean生命周期的关系
热门推荐
A股关键日!又出手了
相亲第二次见面地点攻略:咖啡厅、公园还是餐厅?
新学期课间延长至15分钟,DeepSeek说可以这么做
意大利杯:国际米兰VS拉齐奥 最新数据库精准比分预测
肺孢子菌病的主要传播途径是什么
吴清源一生追求的“六合之棋”指的是什么?
3D打印新手必看:详细解析常见打印材料及其应用场景
ADS-B数据在航空气象服务中的应用
查肺部应该挂什么科
牙髓炎的表现症状及治疗方法
治心血管堵塞中成药哪个好
左小腿疼痛要警惕哪四种病
西安必吃的10家馆子,去过一半才算真正到过西安
环球美食风情录:记录各国美食特色,传递世界饮食魅力
黄瓜可以减肥吗?科学解读黄瓜的减肥效果与食用方法
中西医结合告别“一刀切”,开启精准治疗模式
从10万到50万,最值得入手的家用SUV推荐!
曲阜师范大学管理学院:实施驱动式教学 培养创新型人才
椰子营养价值高,低碳生酮这样吃
水冷散热器能用几年 水冷散热器寿命为什么短
家庭农场:新型农业经营主体的崛起
长期头痛、后枕痛找不到原因?颈源性头痛怎么办?
短视频拍摄脚本设计与案例分析:从构思到审核的完整流程
华为笔记本电脑怎么进入bios设置界面
私家车跑网约车需要什么手续?车主:后悔才知道……
冬季脾胃虚寒有8种中成药可选择的说法正确吗
LoRA(Low-Rank Adaptation)详解
血液检查是否需要空腹
解读光的本质,无处不在的光到底是什么?
河南小麦成熟时间及其影响因素(了解河南小麦成熟的关键时间节点)