Bean 的生命周期从 Spring 容器启动时开始。容器会先扫描并解析所有 Bean 的配置信息,封装成 BeanDefinition 存入 BeanDefinitionMap,之后按需(或预加载)进行 Bean 的创建。
1. 实例化(Instantiation)
容器通过反射调用构造方法,创建 Bean 的原始对象(此时属性还未赋值)。
2. 依赖注入(Populate Properties)
根据 @Autowired、@Resource、@Value 等注解,将依赖的 Bean 或配置值注入到对应字段中。
3. Aware 接口回调
如果 Bean 实现了 BeanNameAware、BeanFactoryAware、ApplicationContextAware 等接口,容器会在此阶段回调对应方法,让 Bean 感知到自身在容器中的信息。
4. BeanPostProcessor 前置处理
执行所有 BeanPostProcessor 的 postProcessBeforeInitialization 方法,可以在初始化前对 Bean 进行加工。
5. 初始化(Initialization)
依次执行:@PostConstruct 标注的方法 → InitializingBean.afterPropertiesSet() → XML/注解中配置的 init-method。
6. BeanPostProcessor 后置处理
执行所有 BeanPostProcessor 的 postProcessAfterInitialization 方法。AOP 代理对象就是在这一步生成的,容器最终放入单例池的是代理对象而非原始对象。
7. 使用
Bean 被放入单例池(singletonObjects),后续通过 getBean() 获取的都是同一个实例。
8. 销毁(Destruction)
容器调用 close() 时,依次执行:@PreDestroy 标注的方法 → DisposableBean.destroy() → 配置的 destroy-method。
一句话总结核心流程:
实例化 → 依赖注入 → Aware 回调 → 后处理器前置 → 初始化 → 后处理器后置(AOP) → 使用 → 销毁