Spring Bean 生命周期
Spring Bean 生命周期是 Spring 框架中一个非常重要的概念,它描述了一个 Bean 从创建到销毁的完整过程。这个生命周期可以分为五个主要阶段:创建前准备阶段、创建实例阶段、依赖注入阶段、容器缓存阶段和销毁实例阶段。下面我们将详细介绍每个阶段的作用,并通过生活中的例子来帮助理解。
创建前准备阶段
定义与作用: 在这一阶段,Spring 容器会解析配置文件或注解,查找并加载需要被管理的 Bean 的相关信息。这包括解析 init-method
和 destroy-method
属性,以及识别任何实现了 BeanFactoryPostProcessor
接口的类。这些信息用于扩展 Bean 加载过程中的功能,允许开发者自定义 Bean 的初始化和销毁行为
生活中的例子: 想象你正在准备一顿晚餐。在这个阶段,你会查看菜谱(类似于解析配置文件),列出所有需要的食材(类似于查找 Bean 的相关信息),并确保厨房里有必要的工具(类似于识别扩展点)。这一切都是为了确保接下来的烹饪过程顺利进行。
创建实例阶段
定义与作用: 此阶段的核心任务是通过反射机制创建 Bean 的实例对象。此外,还会扫描和解析 Bean 声明的一些属性。例如,如果 Bean 配置了特定的构造函数参数,Spring 将使用这些参数来实例化对象
生活中的例子: 继续用晚餐的例子,现在你需要根据菜谱开始制作菜肴。这意味着你要按照食谱上的步骤实际动手操作,比如切菜、调味等,这就好比通过反射创建 Bean 实例的过程。
依赖注入阶段
定义与作用: 一旦 Bean 实例被创建出来,Spring 容器就会检查该 Bean 是否存在对其它 Bean 的依赖关系。如果有,则会将这些依赖注入到当前 Bean 中。常见的依赖注入方式包括使用 @Autowired
注解或者 setter 方法。同时,在此阶段还会触发一些扩展点的调用,如 BeanPostProcessors
和 InitializingBean
接口的方法
生活中的例子: 回到我们的晚餐场景,当你完成了一道菜的基础准备工作后,可能还需要添加其他已经准备好的配料(比如已经煮熟的米饭或炒好的配菜)。这就是一种“依赖”的体现——一道完整的菜品依赖于多个组成部分才能最终呈现。
容器缓存阶段
定义与作用: 在此阶段,Spring 容器会将 Bean 实例保存到其内部缓存中,使得该 Bean 可以被应用程序直接使用。此阶段还会调用 init-method
配置的方法以及 postProcessAfterInitialization
方法,确保 Bean 已经完全准备好供业务逻辑调用
生活中的例子: 假设你的菜肴已经做好并且摆盘完毕,现在你可以把它放在餐桌上让大家享用。同样地,在软件开发中,当 Bean 被正确初始化并存储进缓存之后,它就可以被应用程序随时调用了。
销毁实例阶段
定义与作用: 当应用上下文关闭时,Spring 容器会销毁所有的 Bean 实例。如果某个 Bean 实现了 DisposableBean
接口或配置了 destroy-method
属性,则相应的销毁方法会被调用,释放资源
生活中的例子: 最后,清理餐桌,把剩下的食物放入冰箱保存或者丢弃不再需要的部分。这一步骤对应于 Bean 的销毁阶段,其中涉及到释放内存和其他系统资源。