当前位置: 首页 > article >正文

SpringBean生命周期的执行流程

Spring Bean 的生命周期是 Spring 框架中最核心的机制之一,它定义了 Bean 从创建到销毁的完整过程。以下是其执行流程的详细总结(以 Singleton 作用域为例):


一、Bean 生命周期核心流程

1. Bean 元信息加载
  • BeanDefinition 加载
    通过 ClassPathScanningXML 配置或 @Bean 注解等方式,将 Bean 的定义信息解析为 BeanDefinition 对象,存储在 BeanFactory 中。

    // 例如:通过 @Component 注解扫描的类会生成 BeanDefinition
2. Bean 实例化阶段
  • 构造器调用
    调用 Bean 的构造函数(或工厂方法),创建 Bean 的实例对象。

    public class MyBean {
        public MyBean() { /* 构造器逻辑 */ }
    }
  • BeanPostProcessor 前置处理
    调用 BeanPostProcessor.postProcessBeforeInitialization() 方法,允许在 Bean 初始化前修改实例。

    // 示例:通过 BeanPostProcessor 修改 Bean 属性
    public class CustomBeanPostProcessor implements BeanPostProcessor {
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) {
            // 修改 Bean 的逻辑
            return bean;
        }
    }
3. 依赖注入阶段
  • 属性赋值(Setter/Field 注入)
    通过 @Autowired@Value 或 XML 配置的 <property> 标签,为 Bean 的属性赋值。

    public class MyBean {
        @Autowired
        private Dependency dependency;
    }
  • Aware 接口回调
    如果 Bean 实现了 Aware 接口(如 BeanNameAwareApplicationContextAware),Spring 会调用对应方法注入上下文信息。

    public class MyBean implements BeanNameAware {
        @Override
        public void setBeanName(String name) {
            // 获取 Bean 的名称
        }
    }
4. 初始化阶段
  • @PostConstruct 注解方法
    调用标记了 @PostConstruct 注解的方法。

    public class MyBean {
        @PostConstruct
        public void init() { /* 初始化逻辑 */ }
    }
  • InitializingBean 接口
    如果 Bean 实现了 InitializingBean 接口,调用 afterPropertiesSet() 方法。

    public class MyBean implements InitializingBean {
        @Override
        public void afterPropertiesSet() { /* 初始化逻辑 */ }
    }
  • 自定义 init-method
    调用通过 XML 配置或 @Bean(initMethod = "customInit") 指定的自定义初始化方法。

    public class MyBean {
        public void customInit() { /* 自定义初始化逻辑 */ }
    }
  • BeanPostProcessor 后置处理
    调用 BeanPostProcessor.postProcessAfterInitialization() 方法,允许在 Bean 初始化后修改实例(如 AOP 代理的生成)。

    public class CustomBeanPostProcessor implements BeanPostProcessor {
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) {
            // 返回可能的代理对象
            return bean;
        }
    }
5. Bean 使用阶段
  • Bean 就绪
    此时 Bean 已被 Spring 容器管理,可通过 ApplicationContext.getBean() 获取并使用。

6. 销毁阶段
  • @PreDestroy 注解方法
    调用标记了 @PreDestroy 注解的方法(仅在容器关闭时触发)。

    public class MyBean {
        @PreDestroy
        public void preDestroy() { /* 销毁前逻辑 */ }
    }
  • DisposableBean 接口
    如果 Bean 实现了 DisposableBean 接口,调用 destroy() 方法。

    public class MyBean implements DisposableBean {
        @Override
        public void destroy() { /* 销毁逻辑 */ }
    }
  • 自定义 destroy-method
    调用通过 XML 配置或 @Bean(destroyMethod = "customDestroy") 指定的自定义销毁方法。

    public class MyBean {
        public void customDestroy() { /* 自定义销毁逻辑 */ }
    }

二、生命周期流程图

plaintext

BeanDefinition 加载 → 实例化(构造器) → BeanPostProcessor 前置处理 → 依赖注入 → Aware 接口回调 → 
@PostConstruct → InitializingBean → init-method → BeanPostProcessor 后置处理 → Bean 就绪 → 
@PreDestroy → DisposableBean → destroy-method

三、关键扩展点

扩展点说明
BeanPostProcessor在 Bean 初始化前后插入自定义逻辑(如 AOP 代理生成)。
BeanFactoryPostProcessor在 BeanDefinition 加载后、Bean 实例化前修改元数据(如修改属性值)。
Aware 接口获取 Spring 底层资源(如 BeanName、ApplicationContext)。
@PostConstruct/@PreDestroy通过注解定义初始化和销毁逻辑。
InitializingBean/DisposableBean通过接口定义初始化和销毁逻辑。

四、特殊场景

  1. Prototype Bean 的生命周期

    • Spring 容器不管理 Prototype Bean 的销毁阶段,需手动处理资源释放。

  2. 循环依赖

    • 通过三级缓存解决(singletonFactoriesearlySingletonObjectssingletonObjects)。

  3. 懒加载(Lazy-init)

    • 在首次请求时才会触发 Bean 的创建和初始化。


五、总结

  • Spring Bean 的生命周期通过回调接口扩展点提供了高度灵活性。

  • 理解生命周期流程是解决 Bean 初始化顺序、依赖注入问题、性能优化的基础。

  • 关键扩展点(如 BeanPostProcessor)是实现框架级功能(如 AOP、事务管理)的核心机制。


http://www.kler.cn/a/553276.html

相关文章:

  • Oracle 迁移到 PostgreSQL
  • Cloud之快照存储(Cloud Snapshot Storage)
  • 近地面无人机植被定量遥感与生理参数反演
  • Python基于机器学习的新闻文本分类系统(附源码,文档说明)
  • 迪威模型网:免费畅享 3D 打印盛宴,科技魅力与趣味创意并存
  • 【JavaEE进阶】MyBatis通过XML实现增删改查
  • 【从0做项目】Java搜索引擎(8) 停用词表 正则
  • 2015年下半年试题二:论软件系统架构风格
  • C++类与对象深度解析(一):从引用、内联函数到构造析构的编程实践
  • 成人床垫更新关于 SOR/2016-183 和《纺织品贴标和广告法规》的合规
  • JavaAPI常用类型(包装类、BigDecimal类)
  • HarmonyOS学习第1天:走进 HarmonyOS开启万物互联新时代
  • 以教代学——费曼学习法
  • 虚拟机切换BIOS/UEFI
  • Python天梯赛刷题-五分题(上)
  • spring boot知识点1
  • playwright 管理测试集+page页面操作
  • 【优先级队列】任务分配
  • c++进阶———继承
  • 基于ffmpeg+openGL ES实现的视频编辑工具(一)