问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

深度剖析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生命周期的关系
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号