深度剖析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生命周期的关系
热门推荐
叠字起名的起名方法 好听的叠字名字推荐
古埃及乐器:种类、特点与文化传承
Excel中计算一句话字数的多种方法
濛溪河遗址:再现远古先民的“奋斗史”
遇见你丨李祖杰:“醒狮四代”的传承之路
定量分析常用四个方法及案例
脚气的治疗方法和日常护理要点
感冒会失去味觉和嗅觉正常吗?
澳大利亚国旗图片及其含义分析
宇宙命运三选一:膨胀、崩塌还是永恒?科学家最新观测揭示
消费金融2024:新规引领下,挑战与变革交织
清代血亲复仇的法律规制
“银十”超过“金九”!专家:当前购房政策已属历史最宽松,市场回暖趋势明显
日内V形大逆转!基金解读债市“风波”,要止盈了吗?
变分自编码器 VAE 超详解:从基本概念到模型实现
劳务收入的个税怎么计算深圳
光学魅力:揭秘光与影的奇幻世界
Excel中快速提取一列数据的多种方法
日本有妖怪嗎?
中药学专业主要学什么?专业课程有哪些?
皎皎白驹、呦呦鹿鸣......看《诗经》里的“动物世界”
倍他乐克正确吃法
小成本手工艺品创业项目销量提升策略
男人情感的觉醒与转变:爱的迹象与准备
没钱了,就能戒赌吗?
年限是什么意思
港股市场中的股票交易查封:法规、程序与影响
大同火山群 | 狼窝山教育路线,安排!
详解高性价比电脑主板选购指南:从CPU兼容性到品牌对比
超详细网上立案操作指南:足不出户轻松完成立案流程