Bean的生命周期
Spring Boot 中的 Bean 生命周期与 Spring 框架一致,由 IoC 容器管理,涵盖从实例化到销毁的完整流程。以下是详细解析:
一、Bean 生命周期的核心阶段
Spring Boot 中 Bean 的生命周期主要分为 4 个阶段,每个阶段包含扩展点和关键逻辑:
1. 实例化(Instantiation)
- 作用:通过反射创建 Bean 的实例,分配内存空间。
- 扩展点:
InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation:在实例化前执行,可返回代理对象替代原 Bean)。InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation:实例化后调用,可跳过属性赋值阶段。
- 示例:
public class UserService { public UserService() { System.out.println("Bean 实例化完成"); } }
2. 属性赋值(Populate)
- 作用:注入依赖、设置属性值(如
@Autowired、@Value)。 - 扩展点:
InstantiationAwareBeanPostProcessor#postProcessProperties:自定义属性值修改。
- 代码逻辑:
@Service public class OrderService { @Autowired private UserService userService; // 依赖注入 }
3. 初始化(Initialization)
- 步骤:
- Aware 接口回调:执行
BeanNameAware、BeanFactoryAware等接口,注入容器相关信息。 - 初始化前置处理:通过
BeanPostProcessor#postProcessBeforeInitialization执行自定义逻辑(如日志、校验)。 - 初始化方法:
InitializingBean#afterPropertiesSet:实现接口定义初始化逻辑。@PostConstruct:注解标注的初始化方法。- XML 或
@Bean(initMethod = "xxx"):自定义初始化方法。
- 初始化后置处理:通过
BeanPostProcessor#postProcessAfterInitialization执行(如代理增强)。
- Aware 接口回调:执行
- 示例:
@Service public class PaymentService implements InitializingBean { @PostConstruct public void init() { System.out.println("@PostConstruct 初始化"); } @Override public void afterPropertiesSet() { System.out.println("InitializingBean 初始化"); } }
4. 销毁(Destruction)
- 触发条件:容器关闭时(如调用
context.close())。 - 销毁逻辑:
DisposableBean#destroy:实现接口定义销毁逻辑。@PreDestroy:注解标注的销毁方法。- XML 或
@Bean(destroyMethod = "xxx"):自定义销毁方法。
- 示例:
@Service public class CacheService implements DisposableBean { @PreDestroy public void cleanUp() { System.out.println("清理资源"); } @Override public void destroy() { System.out.println("销毁 Bean"); } }
二、扩展机制与最佳实践
1. 生命周期扩展接口
BeanPostProcessor:在初始化前后插入自定义逻辑(适用于所有 Bean)。@Component public class LoggingBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) { System.out.println("初始化前处理:" + beanName); return bean; } }SmartInitializingSingleton:所有单例 Bean 初始化完成后触发。
2. 最佳实践
- 资源管理:
- 在
@PostConstruct中初始化数据库连接、线程池。 - 在
@PreDestroy中释放资源(如关闭文件句柄)。
- 在
- 避免循环依赖:使用构造器注入或
@Lazy注解。 - 作用域控制:
@RequestScope等短生命周期 Bean 需配合容器事件管理。
三、生命周期完整流程图
graph TD
A[实例化 Bean] --> B[属性赋值]
B --> C[初始化]
C --> C1[Aware 接口回调]
C1 --> C2[BeanPostProcessor 前置处理]
C2 --> C3[执行初始化方法]
C3 --> C4[BeanPostProcessor 后置处理]
C4 --> D[使用 Bean]
D --> E[销毁]
E --> E1[@PreDestroy 方法]
E1 --> E2[DisposableBean#destroy]
四、引用总结
- 阶段划分:实例化 → 属性赋值 → 初始化 → 销毁。
- 扩展点:
BeanPostProcessor、Aware 接口、@PostConstruct/@PreDestroy。 - 线程安全:单例 Bean 需避免共享状态,原型 Bean 每次请求新实例。
通过合理利用生命周期扩展点,可以优化资源管理、增强功能(如 AOP),并提升应用健壮性。

浙公网安备 33010602011771号