深度剖析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生命周期的关系
热门推荐
症状多样,不易察觉,心慌、胸闷、乏力……都可能是这种疾病的信号
丁火命八字中有乙木好吗(丁火和乙木为什么相处不融洽)
粤韵新声:粤语文化推广与粤剧传承之路
新产品导入(NPI)流程简介
帛书《道德经》的深层解码——超越二元对立的宇宙认知
房屋买卖贷款全流程指南及违约处理方案
时尚指南:如何利用皮带提升整体形象?
“90后月嫂热”,育儿观念与职业选择的有益“碰撞”
膝关节保健:组成解析、常见病症及维护攻略
人格障碍分类与诊断标准
如何安排学习英语时间
守护心脏健康的秘诀:健康生活方式不可忽视
春季护眼指南:科学预防干眼,守护双眸明亮
推动“四真三化”生产性实训 深化产教融合服务区域发展
一文让你全面了解WLAN MIMO技术
风冷冰箱散热原理与使用维护指南
嵌入式冰箱散热问题解析:设计、通风与使用习惯的重要性
国考申论备考技巧:议论文如何确定分论点?
如何在人力资源和社会保障部官网申请职业资格证书?
华为手机账号管理:如何从其他设备中删除华为账号
纳斯达克中国金龙指数暴涨超4%,特斯拉、波音尾盘跳水 发生了什么?
伦纳德绝杀瞬间:关键时刻的英雄,快船的三连胜之谜
心理学:跟所爱的人一起睡觉,会大补吗?
不再无聊的回应!如何高情商回复“照顾自己”
调频收音机工作原理、电路图及天线接法
直排式热水器安全教育指南
目前汽车界的趋势之一,Hybrid Engine 四大分类的简单讲解
猫咪老了为什么会消瘦?探究老年猫消瘦的原因及预防方法
“三驾马车”共同拉动癫痫治疗新发展,INC国际大咖与你一起对抗癫痫
肺部有肺大泡严重吗