一文读懂Spring框架中Bean的生命周期

我们先来聊聊bean的生命周期:

bean的生命周期图:

一文读懂Spring框架中Bean的生命周期

AbstractAutowireCapableBeanFactory的docreateBean()方法(简单描述):

1.可以根据源码的时候得出在docreateBean方法里面是bean生命周期的核心逻辑:

//只放了核心逻辑    protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
            throws BeanCreationException {
    // bean初始化第一步:默认调用无参构造实例化Bean
        // 构造参数依赖注入,就是发生在这一步
        if (instanceWrapper == null) {
            //再这个地方完成了对象的创建,推断创建构造方法 进入
            instanceWrapper = createBeanInstance(beanName, mbd, args);
        }
// Initialize the bean instance.

        Object exposedObject = bean;
        try {
            // bean初始化第二步:填充属性(DI依赖注入发生在此步骤)
            // 调用反射和内省去进行属性设置
            // 属性值需要进行类型转换,判断属性注入是否需要
            populateBean(beanName, mbd, instanceWrapper);
            // bean初始化第三步:调用初始化方法,完成bean的初始化操作(AOP发生在此步骤)
            exposedObject = initializeBean(beanName, exposedObject, mbd);
        }
}

我们根据Bean生命周期图进行Bean生命周期的内部讲解:

详细步骤介绍:

实例化:

1:Bean的实例化调用createBeanInstance(beanName, mbd, args)方法 默认调用无参构造实例化Bean

依赖注入:

2.Bean的依赖注入 ->调用->populateBean(beanName, mbd, instanceWrapper)方法 完成 Bean 中所有属性值的配置注入,最终核心还是根据PropertyHandler的setValue()方法进行setter方法的调用(注入);

初始化:

3.检查有无Aware的相关接口设置相关依赖:

3.1.如果Bean 实现了 BeanNameAware 接口,则 Spring 调用 Bean 的 setBeanName() 方法传入当前 Bean 的 id 值。

3.2.如果 Bean 实现了 BeanFactoryAware 接口,则 Spring 调用 setBeanFactory() 方法传入当前工厂实例的引用。

3.3.如果 Bean 实现了 ApplicationContextAware 接口,则 Spring 调用 setApplicationContext() 方法传入当前 ApplicationContext 实例的引用。

一文读懂Spring框架中Bean的生命周期

4.如果 BeanPostProcessor 和 Bean 关联,spring将调用它们的postProcessBeforeInitialization(Object bean, String beanName)(预初始化)方法 它作用是在Bean实例创建成功后进行增强处理(如对Bean进行修改,增加某个功能等)。

5.是否实现InitializingBean接口,如果 Bean 实现了 InitializingBean 接口,则 Spring 将调用 afterPropertiesSet() 方法 作用是在bean正式构造完成前增加我们自己自定义的逻辑(只能增加一些额外的逻辑)。

6.是否配置自定义的init方法(比如说配置文件中通过 init-method 属性指定了初始化方法),配置则执行初始化方法。

7.如果 BeanPostProcessor 和 Bean 关联,spring将调用它们的postProcessBeforeInitialization(Object bean, String beanName),(预初始化) 作用和步骤4一样,只是时机不一样,步骤4是初始化前,这是初始化后。

销毁步骤:

8.如果 Bean 实现了 DisposableBean 接口,则 Spring 会调用 destory() 方法将 Spring 中的 Bean 销毁

9.如果在配置文件中通过 destory-method 属性指定了 Bean 的销毁方法,则 Spring 将调用该方法对 Bean 进行销毁

总结:

Bean的生命周期基本上分为4大步:

1.Bean的实例化 ->createBeanInstance()

2.Bean的属性注入(依赖注入) ->populateBean(beanName, mbd, instanceWrapper);

3.Bean的初始化: ->initializeBean(beanName, exposedObject, mbd);

4:Bean的销毁:是容器关闭时调用的,在ConfigurableApplicationContext类的close()中

Original: https://www.cnblogs.com/yunjie0930/p/15414203.html
Author: 小杰i
Title: 一文读懂Spring框架中Bean的生命周期

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/576386/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 2022-8-31 jsp el表达式

    jsp 注意:1、JSP脚本片段中只能出现java代码,不能出现HTML元素。在 访问JSP时,JSP引擎翻译JSP页面中的脚本片段。2、JSP脚本片段中的java代码必须严格遵守…

    数据库 2023年6月14日
    067
  • 0811JDBC随笔

    1.JDBC体系系统 一组规范:接口 JDBC接口(API)包括两个层次: 面向应用的API:Java API,抽象接口,供应用开发人员使用(连接数据库,执行SQL语句,获得结果)…

    数据库 2023年6月14日
    074
  • SpringMvc(四)- 下载,上传,拦截器

    1、图片下载 图片下载:将服务器端的文件以流的形式写到客户端,通过浏览器保存到本地,实现下载; 1.1 图片下载步骤 1.通过session获取上下文对象(session.getS…

    数据库 2023年6月16日
    054
  • Mybatis-Plus一键生成代码

    Mybatis-Plus一键生成代码 一、闲言碎语 闲来无事看了看了MP的官网看到一键生成的代码更新了! 整个Ui风格都变了,遂决定瞅一眼新的代码生成器 官网地址~~ 二、引入依赖…

    数据库 2023年5月24日
    064
  • Mybatis-Plus使用 ORDER BY FIELD

    一、Mybatis-Plus使用 ORDER BY FIELD 如图所示 两张仅有一个字段关联的表,商品表想用活动商品表查出来的顺序去查商品可以使用以下方法(不想去XML写Sql的…

    数据库 2023年6月6日
    074
  • Redis和Mysql保持数据一致性

    1、简述 在高并发的场景下,大量的请求直接访问Mysql很容易造成性能问题。所以,我们都会用Redis来做数据的缓存,削减对数据库的请求。但是,Mysql和Redis是两种不同的数…

    数据库 2023年6月16日
    079
  • 2022-8-15 数据库 mysql 第一天

    Mysql数据库 数据库 数据库【按照数据结构来组织、存储和管理数据的仓库】。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 数据对于公司来说最宝贵的财…

    数据库 2023年6月14日
    075
  • Minio的安装与使用

    Minio的安装与使用 一、Minio介绍 MinIO 是在 Apache License v2.0 下发布的高性能对象存储. 就是说是个存东西的玩意,比较方便配好启动就能访问,也…

    数据库 2023年6月6日
    089
  • 用 WebClient 代替 RestTemplate

    RestTemplate是用于执行 HTTP 请求的同步客户端,通过底层 HTTP 客户端库(例如 JDK HttpURLConnection、Apache HttpCompone…

    数据库 2023年6月14日
    064
  • MySQL 数据表操作

    MySQL 数据表操作 数据表操作 每个数据表相当于一个文件,文件分为表结构和表记录。 [En] Each data table is equivalent to a file, …

    数据库 2023年5月24日
    064
  • 关于form表单action属性的问题

    通过另一个jsp表单的action跳转到当前jsp undefined* 通过servlet跳转到当前jsp,也就是通过请求转发 <form action="fir…

    数据库 2023年6月16日
    061
  • centos下安装myrocksdb

    承接上一篇,https://www.cnblogs.com/lunyu/p/10190364.html 。编译安装myrocks的整个过程,特别是第2步和第7步,让人冗长难耐。因此…

    数据库 2023年6月14日
    0103
  • 2022-08-17 DQL—-子查询,日期格式

    子查询、日期格式 DQL查询语言 子查询 根据结果集中的行数,子查询可以分为以下几类: [En] According to the number of rows in the re…

    数据库 2023年5月24日
    084
  • 磁盘空间满,如何处理?

    作为运维人员,磁盘空间报警是最寻常遇到的情况,那么遇到空间如何处理呢?这里介绍一下处理办法及处理思路。 操作系统:centos系统 、Ubuntu 1 定位目录 收到空间报警信息,…

    数据库 2023年6月14日
    081
  • Android Studio更改SDK、Gradle以及模拟器默认下载位置

    版本:Android Studio Chipmunk | 2021.2.1 Patch 2时间:2022年9月1日 1、更改SDK位置 找到 File -> Settings…

    数据库 2023年6月16日
    082
  • Django项目中的数据库引擎的修改注意点以及级联删除的设置

    2022-09-29 问题描述: 在”setting.py”的配置文件中修改数据库引擎中,将系统默认的”sqlite3″后缀改为了&…

    数据库 2023年6月14日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球