Spring Bean 生命周期的执行流程

news/2024/7/7 11:26:37

问题描述

        Spring 生命周期全过程大致分为五个阶段:

                1、创建前准备阶段

                2、创建实例阶段

                3、依赖注入阶段

                4、 容器缓存阶段

                5、销毁实例阶段

        下图是 Spring Bean 生命周期完整流程图,其中对每个阶段的具体操作做了详细介绍:

Spring Bean的生命周期_一蓑烟雨任平生-CSDN博客


一、创建前准备阶段【干什么、作用】

        这个阶段主要的作用是,Bean 在开始加载之前,需要从上下文和相关配置中解析并查找 Bean 有关的扩展实现, 比如像

  • `init-method`,容器在初始化 bean 时调用的方法。
  •  `destory-method`,容器在销毁 bean 时调用的方法。
  •  BeanFactoryPostProcessor 这类的 bean 加载过程中的前置和后置处理。           

        这些类或者配置其实是 Spring 提供给开发者,用来实现 Bean 加载过程中的扩展机制, 在很多和 Spring 集成的中间件中比较常见,比如 Dubbo。


 二、创建实例阶段

        这个阶段主要是通过反射来创建 Bean 的实例对象,并且扫描和解析 Bean 声明的一些属性。


 

 三、依赖注入阶段

        如果被实例化的 Bean 存在依赖其他 Bean 对象的情况,则需要对这些依赖 Bean 进行对象注入。比如常见的`@Autowired`、setter 注入等依赖注入的配置形式。

        同时,在这个阶段会触发一些扩展的调用,比如常见的扩展类:BeanPostProcessors (用来实现 bean 初始化前后的扩展回调)、 InitializingBean(这个类有一个 afterPropertiesSet(),这个在工作中也比较常见)、 BeanFactoryAware 等等。


 四、容器缓存阶段

        容器缓存阶段主要是把 Bean 保存到容器以及 Spring 的缓存中,到了这个阶段,Bean 就可以被开发者使用了。 这个阶段涉及到的操作,常见的有,`init-method`这个属性配置的方法, 会在这个阶段调用。 以及像 BeanPostProcessors 方法中的后置处理器方法如:         postProcessAfterInitialization,也会在这个阶段触发。


 五、销毁实例阶段

        当 Spring 应用上下文关闭时,该上下文中的所有 Bean 都会被销毁。 如果存在 Bean 实现了 DisposableBean 接口,或者配置了`destory-method`属性,会在这个阶段被调用。

         

        下面是流程图

 

 


http://www.niftyadmin.cn/n/4924345.html

相关文章

[ubuntu]创建root权限的用户

一、创建新用户 1、创建新用户 sudo useradd -r -m -s /bin/bash 用户名 # -r:建立系统账号 -m:自动建立用户的登入目录 -s:指定用户登入后所使用的shell2、手动为用户设置密码 passwd 用户名 二、为用户增加root权限 1、添加写权限 ch…

Android12.0 原生系统SystemUI下拉状态栏和通知栏视图之锁屏通知布局

1.前言 在12.0的系统rom定制化开发中,对于系统原生systemui的锁屏界面的功能也是非常重要的,所以在锁屏页面布局中,也是有通知栏布局的,所以接下来对于息屏亮屏 通知栏布局的相关流程分析,看下亮屏后锁屏页面做了哪些功能 2.原生系统SystemUI下拉状态栏和通知栏视图之锁…

Flowable-结束事件-取消结束事件

目录 定义图形标记XML内容使用示例视频教程 定义 取消结束事件只能与 BPMN 事务子流程结合使用,它可以取消一个事务子流程的执行,同时 也只能在子流程中执行。实际应用中,会把取消事件,事务子流程,补偿事件一起用。当…

看到很多说工作苦逼的,我也讲讲我的经历吧(2013.09.16)

我是12届电子专业本科毕业生,大四花了很多时间准备考公务员,结果竹篮打水一场空,毕业后到大城市投了400多份简历,面试了20多家,最终说要我的只有5、6家,有的是做取款机维护,转正2200.有的是要到…

基于神经网络的心脏病健康系统

基于神经网络的心脏病健康系统 导语 这篇文章旨在记录该系统设计的过程,同时指导从零开始搭建本健康系统的环境,并在自己的电脑上把这个心脏病健康系统run起来。 下面是这个文件夹下各个文件的介绍: .\心脏病预测 ├─build --- 该系…

LAMMPS推出GUI界面,模拟从未如此简单

lammps一直没有编辑界面,对新手来说特别的不友好,不过,今年8月4号lammps推出了一款包含界面的版本。 运行效果如下图所示,这个版本带有独立的编辑界面,可以使用菜单新建或者打开in文件,也可以使用菜单运行…

如何阐述自己做了一个什么样的东西

线上qps2000,主要的性能瓶颈在于出现在数据库I/O上。另外,如果是一个正常部署的容器,qps能达到几百就不错了。资讯服务现在做了静态的底层页,所以热点新闻多数会命中底层页,即便没有命中底层页,也会走多层的…

JavaScript:模块化【CommonJS与ES6】

在 JavaScript 编程中,随着项目的复杂性增加,代码的组织和管理变得至关重要。模块化是一种强大的编程概念,它允许我们将代码划分为独立的模块,提高了可维护性和可扩展性。本文将详细介绍 CommonJS 和 ES6 模块,帮助你理…