Spring框架中Bean的生命周期是一个复杂但有序的过程,涵盖了从创建到销毁的各个阶段。以下是Bean生命周期的详细步骤:
1. 实例化(Instantiation)
- 通过构造方法或工厂方法创建Bean的实例。
- 此时对象处于“原始”状态,尚未设置任何属性。
2. 属性赋值/依赖注入(Populate Properties)
- Spring容器注入Bean的依赖项(通过Setter方法、字段注入或构造器注入)。
- 例如:通过
@Autowired、@Resource或XML中的<property>标签完成依赖注入。
3. Aware接口回调
- 若Bean实现了特定的
Aware接口,Spring会调用对应方法,传递相关依赖:- BeanNameAware:
setBeanName(String name)(设置Bean的名称)。 - BeanFactoryAware:
setBeanFactory(BeanFactory factory)(设置BeanFactory引用)。 - ApplicationContextAware:
setApplicationContext(ApplicationContext context)(设置ApplicationContext引用,需注意可能触发其他初始化操作)。
- BeanNameAware:
4. BeanPostProcessor的前置处理(postProcessBeforeInitialization)
- 所有注册的
BeanPostProcessor的postProcessBeforeInitialization()方法被调用。 - 可用于修改Bean实例(如生成代理对象、修改属性值)。
5. 初始化方法(Initialization)
- @PostConstruct注解的方法:优先执行。
- InitializingBean接口的
afterPropertiesSet()方法:随后执行。 - 自定义初始化方法:通过XML的
init-method属性或@Bean(initMethod = "...")指定的方法最后执行。
6. BeanPostProcessor的后置处理(postProcessAfterInitialization)
- 所有注册的
BeanPostProcessor的postProcessAfterInitialization()方法被调用。 - 通常用于AOP动态代理的生成或最终增强处理。
7. Bean就绪(Ready for Use)
- 此时Bean已完全初始化,可被应用程序使用(如通过
getBean()获取)。
8. 销毁阶段(Destruction)
- @PreDestroy注解的方法:容器关闭时首先执行。
- DisposableBean接口的
destroy()方法:随后执行。 - 自定义销毁方法:通过XML的
destroy-method属性或@Bean(destroyMethod = "...")指定的方法最后执行。
其他关键点
- BeanPostProcessor的作用:贯穿整个生命周期,允许在初始化前后插入自定义逻辑。
- 循环依赖处理:Spring通过三级缓存(未完成实例化、已实例化未注入、完整Bean)解决单例Bean的循环依赖。
- 作用域影响:原型(Prototype)作用域的Bean不会触发销毁方法,仅单例(Singleton)Bean会完整执行生命周期。
- 扩展接口:如
InstantiationAwareBeanPostProcessor允许在实例化前后干预,属于更高级定制。
流程图概览
实例化 → 属性注入 → Aware接口回调 → BeanPostProcessor前置处理 → 初始化方法 → BeanPostProcessor后置处理 → 使用 → 销毁
理解Bean生命周期有助于在开发中合理利用回调方法和扩展点,优化资源管理和增强Bean功能。
1万+

被折叠的 条评论
为什么被折叠?



