Spring-Bean的生命周期
一、什么是Bean生命周期?
Spring容器中的Bean从创建到销毁的完整过程被称为Bean生命周期,包含实例化→属性注入→初始化→使用→销毁五个核心阶段。Spring提供了丰富的扩展点,允许开发者在各阶段插入自定义逻辑。
二、Bean生命周期全流程(附流程图)
开始│├─ 1. Bean定义注册│├─ 2. 实例化(构造函数)│├─ 3. 属性注入(DI)│├─ 4. 初始化阶段│ ├─ 4.1 BeanNameAware等Aware接口│ ├─ 4.2 BeanPostProcessor前置处理│ ├─ 4.3 @PostConstruct注解│ ├─ 4.4 InitializingBean接口│ └─ 4.5 init-method指定方法│├─ 5. 使用阶段(业务逻辑)│└─ 6. 销毁阶段├─ 6.1 @PreDestroy注解├─ 6.2 DisposableBean接口└─ 6.3 destroy-method指定方法
结束
三、核心阶段详解(含代码示例)
1. Bean定义注册
<!-- XML配置示例 -->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" init-method="init" destroy-method="close"/>
// Java配置示例
@Bean(initMethod = "init", destroyMethod = "close")
public DataSource dataSource() {return new HikariDataSource();
}
2. 实例化阶段
- 通过反射调用构造函数
- 注意循环依赖问题(三级缓存机制)
3. 属性注入(DI)
- @Autowired注解字段注入
- Setter方法注入
- 构造函数注入(推荐)
4. 初始化阶段扩展点
public class DatabaseService implements InitializingBean, BeanNameAware {@Autowiredprivate DataSource dataSource;// 1. Aware接口@Overridepublic void setBeanName(String name) {System.out.println("BeanNameAware: " + name);}// 2. @PostConstruct@PostConstructpublic void postConstruct() {System.out.println("@PostConstruct执行");}// 3. InitializingBean@Overridepublic void afterPropertiesSet() {System.out.println("InitializingBean接口方法执行");}// 4. init-methodpublic void customInit() {System.out.println("自定义init方法执行");}
}
5. 销毁阶段示例
@Component
public class CacheManager implements DisposableBean {@PreDestroypublic void preDestroy() {System.out.println("@PreDestroy执行");}@Overridepublic void destroy() {System.out.println("DisposableBean接口方法执行");}public void clearCache() {System.out.println("自定义destroy方法执行");}
}
四、扩展机制:BeanPostProcessor
实现该接口可对Bean进行全局处理:
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) {System.out.println("Before初始化: " + beanName);return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) {System.out.println("After初始化: " + beanName);return bean;}
}
五、生命周期管理最佳实践
-
初始化顺序:
Constructor > @Autowired > @PostConstruct > InitializingBean > init-method
-
销毁顺序:
@PreDestroy > DisposableBean > destroy-method
-
应用场景:
- 数据库连接池初始化
- 缓存预热
- 资源清理(如文件句柄关闭)
- 性能监控埋点
六、常见面试考点
- BeanFactory和ApplicationContext在Bean初始化时机上的区别
- 循环依赖的解决原理
- 如何选择不同的初始化方式?
- BeanPostProcessor与BeanFactoryPostProcessor区别
- 原型(prototype)Bean的生命周期管理
七、总结
- Bean 生命周期流程图:实例化 -> 2. 依赖注入 -> 3. 初始化 -> 4. 使用 -> 5. 销毁
- Spring 的生命周期由 Spring 容器管理,从 Bean 的创建到销毁都由容器负责。
- Spring 提供了很多钩子方法(如 InitializingBean、DisposableBean、@PostConstruct、@PreDestroy)来让你在 Bean 的生命周期内进行干预。