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

Spring Bean生命周期全面解析

目录

概述

Spring Bean生命周期阶段

1. 实例化阶段

2. 属性赋值阶段

3. Aware接口回调阶段

4. BeanPostProcessor前置处理

5. 初始化阶段

@PostConstruct注解方法

InitializingBean接口

自定义init方法

6. BeanPostProcessor后置处理

7. Bean使用阶段

8. 销毁阶段

@PreDestroy注解方法

DisposableBean接口

自定义destroy方法

完整示例代码

1. 定义Bean类

2. 配置BeanPostProcessor

3. 配置类

4. 测试类

生命周期流程图

总结


概述

Spring Bean的生命周期是Spring框架的核心概念之一,理解Bean从创建到销毁的整个过程对于开发高质量的Spring应用程序至关重要。本文将详细梳理Spring Bean生命周期的各个阶段,并通过代码示例展示每个关键节点。

Spring Bean生命周期阶段

1. 实例化阶段

Spring容器通过构造函数或工厂方法创建Bean实例

public class ExampleBean {public ExampleBean() {System.out.println("1. Bean实例化 - 构造函数执行");}
}

2. 属性赋值阶段

Spring容器注入Bean的属性和依赖

public class ExampleBean {private String name;private AnotherBean anotherBean;// Setter方法用于属性注入public void setName(String name) {System.out.println("2. 属性注入 - name: " + name);this.name = name;}public void setAnotherBean(AnotherBean anotherBean) {System.out.println("2. 依赖注入 - anotherBean");this.anotherBean = anotherBean;}
}

3. Aware接口回调阶段

Bean实现Aware接口获取容器资源

public class ExampleBean implements BeanNameAware, BeanFactoryAware, ApplicationContextAware {@Overridepublic void setBeanName(String name) {System.out.println("3. BeanNameAware - Bean名称: " + name);}@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println("3. BeanFactoryAware - BeanFactory注入");}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {System.out.println("3. ApplicationContextAware - ApplicationContext注入");}
}

4. BeanPostProcessor前置处理

BeanPostProcessor的postProcessBeforeInitialization方法

@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof ExampleBean) {System.out.println("4. BeanPostProcessor前置处理 - " + beanName);}return bean;}
}

5. 初始化阶段

@PostConstruct注解方法
public class ExampleBean {@PostConstructpublic void postConstruct() {System.out.println("5.1 @PostConstruct方法执行");}
}
InitializingBean接口
public class ExampleBean implements InitializingBean {@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("5.2 InitializingBean.afterPropertiesSet()执行");}
}
自定义init方法
public class ExampleBean {public void customInit() {System.out.println("5.3 自定义init方法执行");}
}// 配置类中指定init方法
@Configuration
public class AppConfig {@Bean(initMethod = "customInit")public ExampleBean exampleBean() {return new ExampleBean();}
}

6. BeanPostProcessor后置处理

BeanPostProcessor的postProcessAfterInitialization方法

@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof ExampleBean) {System.out.println("6. BeanPostProcessor后置处理 - " + beanName);}return bean;}
}

7. Bean使用阶段

Bean完全初始化,可供应用程序使用

@Service
public class BusinessService {private final ExampleBean exampleBean;public BusinessService(ExampleBean exampleBean) {this.exampleBean = exampleBean;}public void doBusiness() {System.out.println("7. Bean使用阶段 - 执行业务逻辑");}
}

8. 销毁阶段

@PreDestroy注解方法
public class ExampleBean {@PreDestroypublic void preDestroy() {System.out.println("8.1 @PreDestroy方法执行");}
}
DisposableBean接口
public class ExampleBean implements DisposableBean {@Overridepublic void destroy() throws Exception {System.out.println("8.2 DisposableBean.destroy()执行");}
}
自定义destroy方法
public class ExampleBean {public void customDestroy() {System.out.println("8.3 自定义destroy方法执行");}
}// 配置类中指定destroy方法
@Configuration
public class AppConfig {@Bean(destroyMethod = "customDestroy")public ExampleBean exampleBean() {return new ExampleBean();}
}

完整示例代码

1. 定义Bean类

import org.springframework.beans.factory.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;public class LifecycleBean implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean {private String name;private AnotherBean anotherBean;public LifecycleBean() {System.out.println("1. 构造函数执行 - Bean实例化");}public void setName(String name) {System.out.println("2. 属性注入 - name: " + name);this.name = name;}public void setAnotherBean(AnotherBean anotherBean) {System.out.println("2. 依赖注入 - anotherBean");this.anotherBean = anotherBean;}@Overridepublic void setBeanName(String name) {System.out.println("3. BeanNameAware - Bean名称: " + name);}@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println("3. BeanFactoryAware - BeanFactory注入");}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {System.out.println("3. ApplicationContextAware - ApplicationContext注入");}@PostConstructpublic void postConstruct() {System.out.println("5.1 @PostConstruct方法执行");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("5.2 InitializingBean.afterPropertiesSet()执行");}public void customInit() {System.out.println("5.3 自定义init方法执行");}public void doSomething() {System.out.println("7. Bean使用阶段 - 执行业务方法");}@PreDestroypublic void preDestroy() {System.out.println("8.1 @PreDestroy方法执行");}@Overridepublic void destroy() throws Exception {System.out.println("8.2 DisposableBean.destroy()执行");}public void customDestroy() {System.out.println("8.3 自定义destroy方法执行");}
}

2. 配置BeanPostProcessor

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof LifecycleBean) {System.out.println("4. BeanPostProcessor前置处理 - " + beanName);}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof LifecycleBean) {System.out.println("6. BeanPostProcessor后置处理 - " + beanName);}return bean;}
}

3. 配置类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Bean(initMethod = "customInit", destroyMethod = "customDestroy")public LifecycleBean lifecycleBean() {LifecycleBean bean = new LifecycleBean();bean.setName("示例Bean");return bean;}@Beanpublic AnotherBean anotherBean() {return new AnotherBean();}
}

4. 测试类

import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class LifecycleTest {public static void main(String[] args) {System.out.println("Spring容器启动...");AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);System.out.println("\n获取Bean并执行业务方法...");LifecycleBean bean = context.getBean(LifecycleBean.class);bean.doSomething();System.out.println("\nSpring容器关闭...");context.close();System.out.println("程序结束");}
}

生命周期流程图

Bean生命周期完整流程:
1. 实例化 → 2. 属性赋值 → 3. Aware接口回调 → 4. BeanPostProcessor前置处理 →
5. 初始化(@PostConstruct → InitializingBean → 自定义init) → 6. BeanPostProcessor后置处理 →
7. Bean就绪可用 → 8. 销毁(@PreDestroy → DisposableBean → 自定义destroy)

总结

Spring Bean的生命周期是一个复杂但有序的过程,理解每个阶段的执行顺序和用途对于:

  1. 调试和问题排查:能够快速定位Bean初始化相关的问题
  2. 扩展功能:通过BeanPostProcessor等机制扩展Spring功能
  3. 资源管理:正确管理数据库连接、线程池等资源
  4. 性能优化:合理使用各种初始化机制提升应用性能
http://www.dtcms.com/a/392361.html

相关文章:

  • [vibe code追踪] 侧边栏UI管理器 | showSidebarContent
  • 嵌入式ARM架构学习9——IIC
  • 多线程——线程安全的练习加感悟
  • 使用 TwelveLabs 的 Marengo 视频嵌入模型与 Amazon Bedrock 和 Elasticsearch
  • Windows 11 下 Notepad++ 等应用无法启动问题排查修复
  • 面向口齿不清者的语音识别新突破:用大模型拯救“听不懂”的声音
  • 服装企业优化信息化管理系统的最佳软件选择
  • 多阶段构建镜像
  • 推荐一个开源服务器一键自动重装系统脚本:reinstall
  • 【C++进阶】C++11 的新特性 | lambda | 包装器
  • 2.【QT 5.12.12 安装 Windows 版本】
  • Rust_2025:阶段1:day6.3 macro
  • 【Qt开发】输入类控件(一)-> QLineEdit
  • python10——组合数据类型(集合)
  • 分布式专题——14 RabbitMQ之集群实战
  • WEEX唯客的多维度安全守护
  • 深度学习环境配置
  • 生鲜速递:HTTP 的缓存控制
  • ​​Snipaste 2.10.1.dmg截图安装教程|Mac电脑拖拽安装详细步骤​
  • 10.1.1 使用python完成第一个遗传算法
  • C语言内存精讲系列(二十九):C 语言堆区内存进阶与动态内存实战
  • 6G量子通信融合:破解未来网络的安全与效能密码
  • C#练习题——泛型实现单例模式和增删改查
  • 网关登录校验
  • Kubernetes Fluent Bit Pod Pending 问题解决方案
  • 我爱学算法之—— 位运算(中)
  • 什么是差分信号
  • 相机标定(Camera Calibration)原理及步骤:从 “像素模糊” 到 “毫米精准” 的关键一步
  • 用 【C# + WinUI3 + 图像动画】 来理解:高数 - 函数 - 初等函数
  • ​​[硬件电路-296]:单刀双掷(SPDT)模拟开关