Java Spring 框架技术从入门到放弃:Spring生态之Spring Bean 生命周期学习笔记(重点标注版)
一、核心概念与生活案例
生命周期阶段:Spring Bean 从创建到销毁的完整过程,包含实例化、初始化、使用和销毁四个阶段。
生活案例:餐厅的「咖啡机」生命周期:
- 生产制造(实例化):工厂根据订单生产咖啡机。
- 安装调试(初始化):餐厅开业前检查功能并预热。
- 日常使用(使用阶段):为顾客制作咖啡。
- 退役报废(销毁):设备老化后断电回收。
二、生命周期四大阶段详解
1. 实例化(Instantiation)
核心:通过构造器或工厂方法创建 Bean 对象。
重点:
- 构造器注入依赖在此阶段完成(如咖啡机需要电源)。
- 循环依赖检测:Spring 启动时检查构造器循环依赖(如咖啡机需要咖啡豆,咖啡豆需要咖啡机)。
代码示例:
public class CoffeeMachine {
private final PowerSocket socket;
public CoffeeMachine(PowerSocket socket) { // 构造器实例化
this.socket = socket;
}
}
2. 初始化(Initialization)
核心:Bean 实例化后执行初始化逻辑。
重点:
- 回调方法:
@PostConstruct
(JSR-250 标准)InitializingBean#afterPropertiesSet()
- XML 配置的
init-method
- 典型用途:数据库连接、资源加载、参数校验。
案例:咖啡机预热:
public class CoffeeMachine {
@PostConstruct // 重点:标注初始化方法
public void preheat() {
System.out.println("咖啡机预热至 90℃");
}
}
3. 使用(Usage)
核心:Bean 提供服务的阶段,可处理业务逻辑。
重点:
- 线程安全:单例 Bean 需注意状态共享(如咖啡机同时处理多个订单)。
- AOP 织入:Spring 在此阶段将切面逻辑注入(如记录咖啡制作日志)。
代码示例:
@Service
public class CoffeeService {
public String makeCoffee(String type) {
return "制作了一杯 " + type + " 咖啡";
}
}
4. 销毁(Destruction)
核心:容器关闭时释放资源。
重点:
- 回调方法:
@PreDestroy
(JSR-250 标准)DisposableBean#destroy()
- XML 配置的
destroy-method
- 典型用途:关闭数据库连接、释放文件句柄。
案例:咖啡机断电维护:
public class CoffeeMachine {
@PreDestroy // 重点:标注销毁方法
public void shutdown() {
System.out.println("咖啡机断电,清洁内部");
}
}
三、关键扩展点
1. BeanPostProcessor(重点)
核心:在 Bean 初始化前后进行增强。
案例:餐厅质检人员检查咖啡机是否合格:
@Component
public class MachinePostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
if (bean instanceof CoffeeMachine) {
System.out.println("检查咖啡机型号是否合规");
}
return bean;
}
}
2. 作用域影响
重点:不同作用域的生命周期差异:
3. 延迟初始化与生命周期
重点:延迟 Bean 的初始化方法在首次使用时执行,而非容器启动时。
四、最佳实践与避坑指南
-
资源释放必做项:
- 在
@PreDestroy
中关闭数据库连接、停止线程池等。 - 反模式:依赖 JVM 垃圾回收自动释放资源(可能导致内存泄漏)。
- 在
-
避免循环依赖:
- 构造器循环依赖 → Spring 启动时报错(如 A → B → A)。
- 解决方案:使用
@Lazy
或调整依赖注入方式。
-
日志记录:
- 在生命周期方法中添加日志,监控 Bean 状态:
@PostConstruct public void logInit() { logger.info("Bean {} initialized", getClass().getName()); }
五、预习:生命周期进阶知识
-
AOP 与生命周期:
- Spring 如何通过
BeanPostProcessor
实现切面代理(如事务管理)。
- Spring 如何通过
-
Spring Boot 自动配置:
@ConditionalOnBean
如何根据 Bean 生命周期动态配置。
-
云原生场景:
- Kubernetes 中通过
@PreDestroy
实现优雅停机(SIGTERM 信号处理)。
- Kubernetes 中通过
-
响应式生命周期:
- Spring WebFlux 中 Reactive 组件的生命周期管理(如
ReactiveAdapterRegistry
)。
- Spring WebFlux 中 Reactive 组件的生命周期管理(如
总结:Bean 生命周期是 Spring 框架的核心机制,掌握其各阶段回调方法的使用,能有效管理资源、增强可维护性。重点关注 @PostConstruct
和 @PreDestroy
的应用场景,结合 BeanPostProcessor
实现自定义扩展。