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

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 实例的引用。

.

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()中

一文读懂Spring框架中Bean的生命周期的更多相关文章

  1. spring框架中Bean的生命周期

    一.Bean 的完整生命周期 在传统的Java应用中,bean的生命周期很简单,使用Java关键字 new 进行Bean 的实例化,然后该Bean 就能够使用了.一旦bean不再被使用,则由Java自 ...

  2. 解释Spring框架中bean的生命周期?

    Spring容器 从XML 文件中读取bean的定义,并实例化bean. Spring根据bean的定义填充所有的属性. 如果bean实现了BeanNameAware 接口,Spring 传递bean ...

  3. 解释 Spring 框架中 bean 的生命周期?

    Spring 容器 从 XML 文件中读取 bean 的定义,并实例化 bean. Spring 根据 bean 的定义填充所有的属性. 如果 bean 实现了 BeanNameAware 接口,Sp ...

  4. 解释 Spring 框架中 bean 的生命周期?

    Spring 容器 从 XML 文件中读取 bean 的定义,并实例化 bean. Spring 根据 bean 的定义填充所有的属性. 如果 bean 实现了 BeanNameAware 接口,Sp ...

  5. Spring 容器中 Bean 的生命周期

    Spring 容器中 Bean 的生命周期 1. init-method 和 destory-method 方法 Spring 初始化 bean 或销毁 bean 时,有时需要作一些处理工作,因此 s ...

  6. (spring-第1回【IoC基础篇】)Spring容器中Bean的生命周期

    日出日落,春去秋来,花随流水,北雁南飞,世间万物皆有生死轮回.从调用XML中的Bean配置信息,到应用到具体实例中,再到销毁,Bean也有属于它的生命周期. 人类大脑对图像的认知能力永远高于文字,因此 ...

  7. IoC基础篇(一)--- Spring容器中Bean的生命周期

    日出日落,春去秋来,花随流水,北雁南飞,世间万物皆有生死轮回.从调用XML中的Bean配置信息,到应用到具体实例中,再到销毁,Bean也有属于它的生命周期. 人类大脑对图像的认知能力永远高于文字,因此 ...

  8. Spring容器中bean的生命周期以及关注spring bean对象的后置处理器:BeanPostProcessor(一个接口)

    Spring IOC 容器对 Bean 的生命周期进行管理的过程: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.将 Bean 实例传递给 ...

  9. spring ApplicationContext中Bean的生命周期

    AbstractApplicationContext Spring的AbstractApplicationContext是ApplicationContext的抽象实现类,该抽象类的refresh方法 ...

  10. Spring容器中Bean的生命周期

随机推荐

  1. c语言代码练习11

    //1-100数字中9的数量 #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h> int main(){ int x = 0; int ...

  2. pci p2p

    概述 在2018年,针对pci支持p2pdma的驱动合入主线,没记错的话应该是4.20. 补丁如下: commit 52916982af48d9f9fc01ad825259de1eb3a9b25e A ...

  3. Oracle:字符串的拼接、截取、查找、替换

    一.拼接:1.使用"||"来拼接字符串: select '拼接'||'字符串' as Str from dual; 2.使用concat(param1,param2)函数实现: s ...

  4. linux- 挂载本地iso,配置本地yum

    ------------------------------------ 关于centos8安装vm-tools: workstation部署centos8之后,不需要单独安装vm-tools,系统已 ...

  5. Oracle 11g数据库详解(2017-01-23更新)

    Oracle 11g数据库详解 整理者:赤勇玄心行天道 QQ:280604597 Email:280604597@qq.com 大家有什么不明白的地方,或者想要详细了解的地方可以联系我,我会认真回复的 ...

  6. 2023 版 Java和python开发线性代数探索

    目录 前景提示 需求 分析 1.初始化不需要指定矩阵的尺寸,并且可以直接传入数据. 2.可以计算2x2矩阵的逆 3.可以做2x2的矩阵乘法 Java版本开发 一. 开发详情 1.开发一个子类,如图所示 ...

  7. MongoDB-SQL语法

    MongoDB-SQL语法 可视化软件:Navicat 1. MongoDB-查询 db.getCollection('表名').find({}); db.getCollection('表名').fi ...

  8. TPshop商城的安装流程(windows)----超详细版

    提前准备 phpStudy下载:https://www.xp.cn/download.html 选择适合自己的版本下载 TPshop商城源文件下载链接:https://pan.baidu.com/s/ ...

  9. WPF应用开发之附件管理

    在我们之前的开发框架中,往往都是为了方便,对附件的管理都会进行一些简单的封装,目的是为了方便快速的使用,并达到统一界面的效果,本篇随笔介绍我们基于SqlSugar开发框架的WPF应用端,对于附件展示和 ...

  10. IDEA提示Cannot resolve symbol 'String'

    一.解决方案: 1.问题原因: 系统提示Cannot resolve symbol 'String',是由于没有正确导入JDK : 2.解决方案: 在project SDK中正确配置即可. 二.完成. ...