深度剖析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生命周期的关系
热门推荐
归脾汤:千年古方的现代价值
建兰养护秘籍:新手也能养出高颜值
蒜香鸡胸肉:低卡美味的秘密武器
鸡胸肉:健身达人的首选蛋白质
鸡胸肉减肥效果爆棚,健身达人必备!
鸡胸肉:健身减脂的最佳拍档
《和平精英》新版本声音优化攻略:让你的游戏体验更上一层楼
《和平精英》声音设置全攻略:让你的游戏音效更震撼!
《和平精英》音效调节完全指南:从基础设置到专业技巧
貔貅买回来不开光可以吗?怎样正确开光和认主?忌讳哪些生肖?
“药食同源”理念奠基人:唐代名医孟诜与《食疗本草》
烧脑与温情:两部平行空间作品的差异化表达
〈左边〉:杨丞琳用音乐演绎爱情中的“平行空间”
医美监管新政下,眼袋手术并发症预防指南
鸡胸肉、三文鱼等五种食材,健身人群的优质蛋白首选
每周吃5个鸡蛋,高血压糖尿病风险降三成
韩国直播平台月活破千万,K-pop明星带货成新趋势
如何做好团队的团建活动
如何通过职场文化提升团队凝聚力与归属感?
成都周边一日游景点:西岭雪山
冬天去四川成都三日游
北京医院张耀光教授:技术创新开启尿失禁治疗新时代
文白异读、多音字频现,闽南话发音规则详解
闽南话:从唐宋古音到两岸共通语,如今却面临消失
团队协作提升工作效率:从目标设定到文化建设的完整指南
职场人际攻略:4个实用方法提升同事关系
职场突破的关键:提升沟通、适应与解决问题能力
人社部发布19个新职业,职业技能培训成职场人发展关键
貔貅在传统风水学中的应用探讨
龙生九子貔貅的来历及传说