深度剖析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生命周期的关系
热门推荐
GPT-3.5-turbo与GPT-4o-mini模型深入对比分析
PO18文:揭开这类文章的创作技巧与市场趋势,如何吸引读者
数说大屏:常看常新的经典老剧,收视占比竟然这么高!
小程序越来越智能化,作为设计师要如何进行创新设计
如何将源码转换成图片
如何提高Web对浏览器的兼容性
出版一本书需要多少字呢?
新春走基层·家有喜事丨新年 新房 新展望
教你几招,远离术后切口感染
华为交换机详细堆叠教程
最全的中央空调安装调试全说明
产后妈妈必知的7大常见问题与解决方案:产后恢复全攻略
精选冬至节气的十首古诗词
揭秘ChatGPT背后的深度学习技术
黄金价格趋势及短期投资策略深度解析
四川绿化竹子种植基地:生态保护与经济发展的双重使命
北京高质量发展 | 传统新型,平谷南山村旧貌换新颜
逻辑思维能力强的人有多“可怕”?
吉他零基础入门指南:从了解构造到简单弹唱
OpenAI官方Prompt工程指南详解:六大原则助力高效人机交互
薑黃怎麼吃最有效?15項功效與禁忌食用建議一次看
小程序开发之Map地图组件详解
最新发布:我国儿童眼轴长度标准
儿童消化不良的成因及缓解方法
提升日常穿搭时尚感的实用搭配技巧解析
肢体接触看两个人的关系
【收藏】史上最详细的火花塞介绍,看完你就是专家!
国内最适合穷游的12个地方,让你花最少的钱,看最美的景
如何介绍好一个前端项目
白果的营养价值与多种食用方法探讨,健康美味不可错过