我们来说一下 bean 的生命周期
Bean 生命周期的详细步骤
第一阶段:Bean 的元数据配置与容器启动
-
配置元数据:首先,你需要通过 XML、Java 注解(如
@Component,@Service,@Autowired)或 Java 配置类(@Configuration,@Bean)来定义 Bean。 -
容器启动:Spring 容器(如
ApplicationContext)启动,加载并解析这些配置元数据,生成每个 Bean 的BeanDefinition对象,它包含了创建一个 Bean 所需的所有信息(如类名、作用域、是否懒加载等)。
第二阶段:Bean 的实例化与初始化(核心生命周期)
1. 实例化(Instantiation)
-
描述:容器首先会调用 Bean 的构造函数(或工厂方法)来创建一个新的实例。此时只是一个简单的 Java 对象,还没有进行依赖注入,我们可以把它比作“新生儿”。
-
扩展点:无直接扩展点。
2. 依赖注入(Populate Properties)
-
描述:Spring 根据配置(如
@Autowired,@Value)将所需的依赖注入到 Bean 的对应属性中。这一步填充了 Bean 的“血肉”。 -
扩展点:无直接扩展点。
3. Aware 接口回调(Aware Interface Injection)
-
描述:如果 Bean 实现了各种
Aware接口,Spring 会在此阶段回调相应的方法,将一些容器相关的对象(如BeanNameAware,BeanFactoryAware,ApplicationContextAware)注入到 Bean 中。 -
扩展点:
-
BeanNameAware:设置 Bean 的 ID/Name。 -
BeanFactoryAware:设置当前的BeanFactory。 -
ApplicationContextAware:设置当前的ApplicationContext(功能最全)。 -
EnvironmentAware:设置Environment对象(用于获取配置文件属性)等。
-
4. BeanPostProcessor 前置处理
-
描述:这是极其重要的扩展点。所有实现了
BeanPostProcessor接口的 Bean,它们的postProcessBeforeInitialization方法会在这个阶段被调用。它可以对 Bean 进行包装或增强,返回一个可能是代理对象的 Bean。 -
扩展点:
BeanPostProcessor.postProcessBeforeInitialization(Object bean, String beanName)
5. 初始化(Initialization)
-
描述:Bean 的“成人礼”。在这个阶段,Bean 的初始化逻辑会被执行。
-
a.
InitializingBean接口:如果 Bean 实现了InitializingBean接口,会调用其afterPropertiesSet()方法。 -
b. 自定义初始化方法:调用通过
@Bean(initMethod = "...")或 XML 中init-method属性指定的自定义初始化方法。
-
-
扩展点:
-
InitializingBean.afterPropertiesSet() -
自定义
init-method
-
6. BeanPostProcessor 后置处理
-
描述:这是另一个极其重要的扩展点。所有
BeanPostProcessor的postProcessAfterInitialization方法会被调用。Spring AOP 就是基于此实现的。如果一个 Bean 需要被代理,通常在这里返回一个代理对象来包装目标 Bean。 -
扩展点:
BeanPostProcessor.postProcessAfterInitialization(Object bean, String beanName)
7. Bean 就绪(Ready)
-
描述:经过以上所有步骤,Bean 已经完全创建、初始化并可能被代理。它被存放在 Spring 容器(单例池)中,可以被应用程序正常获取和使用了。
第三阶段:Bean 的使用与销毁
8. 使用期
-
描述:在应用程序运行期间,Bean 被其他组件依赖和调用,执行业务逻辑。
9. 销毁(Destruction)
-
描述:当 Spring 容器(通常是
ApplicationContext)被关闭时,它会开始销毁容器中的所有单例 Bean。-
a.
DisposableBean接口:如果 Bean 实现了DisposableBean接口,会调用其destroy()方法。 -
b. 自定义销毁方法:调用通过
@Bean(destroyMethod = "...")或 XML 中destroy-method属性指定的自定义销毁方法。常用于释放资源,如关闭数据库连接、文件句柄等。
-
-
扩展点:
-
DisposableBean.destroy() -
自定义
destroy-method
-
特殊情况的处理
-
作用域(Scope):上述生命周期主要针对单例(Singleton) Bean。对于原型(Prototype) 作用域的 Bean,Spring 容器只负责到第 6 步(初始化完成),之后就将 Bean 交给客户端,不再管理其生命周期,因此不会调用销毁方法。
-
延迟初始化(Lazy):标记为
@Lazy的 Bean,只有在第一次被请求时才会触发上述初始化过程,而不是在容器启动时。
总结与记忆技巧
可以把这个过程想象成一个人的一生:
-
实例化:出生
-
依赖注入:接受教育,获取生存技能(依赖)
-
Aware 接口:获得身份ID、认识家庭和社会(容器环境)
-
BeanPostProcessor(前):步入社会前的指导
-
初始化:举行成人礼,开始独立承担责任
-
BeanPostProcessor(后):步入社会后的包装/历练(可能被“代理”)
-
就绪:成为社会栋梁,贡献力量
-
销毁:退休,安享晚年,处理身后事
- 点赞
- 收藏
- 关注作者
评论(0)