Spring Bean的生命周期
以下是Spring Bean生命周期的详细步骤总结,按执行顺序排列:
1. 实例化(Instantiation)
- 触发时机:容器启动时(单例Bean)或每次请求时(原型Bean)
- 方式:
- 构造器反射调用(默认)
- 工厂方法(静态工厂/实例工厂)
2. 属性赋值(Populate Properties)
- 依赖注入:通过Setter方法、字段注入或构造器注入完成属性赋值
- 特殊注入:
@Autowired
、@Resource
、@Value
等注解处理
3. Aware接口回调
- BeanNameAware:注入Bean的ID
- BeanFactoryAware:注入BeanFactory实例
- ApplicationContextAware:注入ApplicationContext(注意:在BeanFactory环境下不生效)
- 其他Aware:如EnvironmentAware、ResourceLoaderAware等
4. BeanPostProcessor前置处理
- 方法:
postProcessBeforeInitialization()
- 典型应用:
- 生成代理对象(如AOP)
- 修改Bean属性(如加密字段解密)
5. 初始化(Initialization)
- InitializingBean接口:执行
afterPropertiesSet()
- 自定义初始化方法:
- XML配置的
init-method
@PostConstruct
注解标注的方法(最先执行)
- XML配置的
6. BeanPostProcessor后置处理
- 方法:
postProcessAfterInitialization()
- 典型应用:
- 最终代理包装(如事务增强)
- 缓存预加载
7. Bean就绪可用
- 此时Bean已进入应用上下文,可被其他组件依赖使用
8. 销毁(Destruction)
- 触发条件:容器关闭时(仅单例Bean)
- 执行顺序:
@PreDestroy
注解方法DisposableBean
接口的destroy()
- XML配置的
destroy-method
- 原型Bean:不会执行销毁方法,需手动清理
完整流程图
特殊场景说明
- 循环依赖:
- 三级缓存解决单例Bean的构造器循环依赖
- 原型Bean的循环依赖直接报错
- 作用域差异:
- 单例Bean:完整生命周期
- 原型Bean:只到初始化阶段,不执行销毁
- FactoryBean:
- 通过
getObject()
创建实际Bean - 生命周期独立于FactoryBean本身
- 通过
监控生命周期的三种方式
- 接口方式:
public class DemoBean implements InitializingBean, DisposableBean {@Overridepublic void afterPropertiesSet() { /* 初始化 */ }@Overridepublic void destroy() { /* 销毁 */ }
}
- 注解方式:
public class DemoBean {@PostConstructpublic void init() { /* 初始化 */ }@PreDestroypublic void cleanup() { /* 销毁 */ }
}
- XML配置方式:
<bean class="com.example.DemoBean" init-method="customInit" destroy-method="customDestroy"/>
性能优化提示
- 尽量避免在生命周期方法中执行耗时操作
- 合理使用
@Lazy
延迟初始化降低启动耗时 - 原型Bean频繁创建/销毁时注意资源释放
掌握Bean生命周期机制,可以更精准地控制组件初始化顺序、资源管理,并实现高级定制功能(如动态代理增强)。