Spring Bean 的生命周期包括了从创建到销毁的一系列过程。具体来说,Spring 容器会在启动时创建和初始化 Beans,并在容器关闭时销毁这些 Beans。以下是 Spring Bean 生命周期的详细步骤:
1. Bean 实例化(Instantiation)
- 当容器启动时,Spring 会根据 Bean 的定义(通过配置文件或者注解)实例化 Bean。Spring 会使用无参构造方法或者配置的工厂方法来实例化 Bean 对象。
2. 设置 Bean 属性(Populating Properties)
- Spring 会通过依赖注入(DI)将 Bean 的属性设置为配置文件或注解中定义的值。如果使用注解如
@Autowired
,Spring 会自动注入相关的依赖。
3. 调用 BeanNameAware
的 setBeanName()
方法
- 如果 Bean 实现了
BeanNameAware
接口,Spring 会调用setBeanName()
方法,传入 Bean 的名称。
4. 调用 BeanFactoryAware
或 ApplicationContextAware
的相应方法
- 如果 Bean 实现了
BeanFactoryAware
,ApplicationContextAware
等接口,Spring 会分别调用setBeanFactory()
或setApplicationContext()
方法,传入相应的工厂或上下文对象。
5. 调用 setBeanClassLoader()
(如果实现了 BeanClassLoaderAware
)
- 如果 Bean 实现了
BeanClassLoaderAware
接口,Spring 会调用setBeanClassLoader()
方法。
6. 初始化前的 @PostConstruct
或实现 InitializingBean
接口
- 如果 Bean 定义了
@PostConstruct
注解,Spring 会在所有属性设置完毕后调用该方法。 - 如果 Bean 实现了
InitializingBean
接口,Spring 会调用afterPropertiesSet()
方法。 - 如果通过 XML 配置了
init-method
,Spring 会调用配置的初始化方法。
7. 初始化(Initialization)
- 在所有属性注入和 Aware 方法调用之后,Spring 会调用 Bean 的初始化方法。可以通过配置
init-method
或实现InitializingBean
来指定初始化过程。
8. 使用 Bean
- Bean 进入正常的工作状态,可以提供服务给应用程序。此时,Bean 已经完全初始化,准备好使用。
9. 销毁前的 @PreDestroy
或实现 DisposableBean
接口
- 当容器销毁时,Spring 会先调用
@PreDestroy
注解方法(如果有的话)。 - 如果 Bean 实现了
DisposableBean
接口,Spring 会调用destroy()
方法。 - 如果通过 XML 配置了
destroy-method
,Spring 会调用指定的销毁方法。
10. 销毁(Destruction)
- 在容器关闭时,Spring 会销毁所有 Bean。销毁的顺序是从容器中最“底层”的 Bean 开始,直到销毁最“顶层”的 Bean。
总结:
- 实例化 → 2. 依赖注入 → 3. Aware 方法 → 4. 初始化 → 5. 使用 → 6. 销毁