SpringBoot:Bean生命周期介绍
SpringBoot:Bean生命周期介绍
- 前言
- 一、Bean 的生命周期介绍
- 二、具体操作顺序
前言
Bean 是 SpringBoot 中一个非常重要的组成部分,是面试中经常会问到的一个问题。
本文介绍了 Bean 的整个生命周期:创建前准备阶段、创建实例阶段、
依赖注入阶段、容器缓存阶段和销毁实例阶段。
一、Bean 的生命周期介绍
Bean 生命周期全过程大致分为五个阶段:创建前准备阶段、创建实例阶段、依赖注入阶段、容器缓存阶段和销毁实例阶段
1、创建前准备阶段
这个阶段主要的作用是,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 属性,会在这个阶段被调用
时序图:
二、具体操作顺序
(1)实例化Bean:
对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBean进行实例化。对于ApplicationContext容器,当容器启动结束后,通过获取BeanDefinition对象中的信息,实例化所有的bean。
(2)设置对象属性(依赖注入):
实例化后的对象被封装在BeanWrapper对象中,紧接着,Spring根据BeanDefinition中的信息 以及 通过BeanWrapper提供的设置属性的接口完成依赖注入。
(3)处理Aware接口:
接着,Spring会检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给Bean:
①如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的就是Spring配置文件中Bean的id值;
②如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory()方法,传递的是Spring工厂自身。
③如果这个Bean已经实现了ApplicationContextAware接口,会调用
setApplicationContext(ApplicationContext)方法,传入Spring上下文;
(4)BeanPostProcessor:
如果想对Bean进行一些自定义的处理,那么可以让Bean实现了BeanPostProcessor接口,那将会调用postProcessBeforeInitialization(Object obj, String s)方法。
(5)InitializingBean 与 init-method:
如果Bean在Spring配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法。
(6)如果这个Bean实现了BeanPostProcessor接口,将会调用
postProcessAfterInitialization(Object obj, String s)方法;由于这个方法是在Bean初始化结束时调用的,所以可以被应用于内存或缓存技术;
以上几个步骤完成后,Bean就已经被正确创建了,之后就可以使用这个Bean了。
(7)DisposableBean:
当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法;
(8)destroy-method:
最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。
SpringBoot:Bean生命周期介绍相关推荐
- springboot bean生命周期
对于普通的Java对象,当new的时候创建对象,当它没有任何引用的时候被垃圾回收机制回收.而由Spring IoC容器托管的对象,它们的生命周期完全由容器控制. Spring IoC容器托管对象的be ...
- springboot学习:bean生命周期
1.bean 生命周期 bean创建-初始化-销毁 构造(对象创建): 单实例:在容器启动的时候创建对象; 多实例:在每次获取的时候创建对象: 初始化: 对象创建完成,并赋值好,调用初始化方法 销毁: ...
- Spring Bean生命周期: Bean的实例化
[Spring Bean 生命周期系列]传送门 1.Spring Bean生命周期: Bean元信息的配置与解析阶段 2.Spring Bean生命周期: Bean的注册 3.Spring Bean生 ...
- Spring Bean生命周期:Bean的初始化阶段
[Spring Bean 生命周期系列]传送门 1.Spring Bean生命周期: Bean元信息的配置与解析阶段 2.Spring Bean生命周期: Bean的注册 3.Spring Bean生 ...
- 【Spring】- Bean生命周期
2019独角兽企业重金招聘Python工程师标准>>> Spring Bean的生命周期: bean对象实例化 属性注入 beanfactory ApplicationContext ...
- spring bean生命周期_Spring中bean的生命周期和扩展点有哪些?
前言 今天和大家分享一下Spring中Bean的生命周期的一些知识.先来说一下什么是生命周期吧,生命周期从其语义上理解就是一个对象从产生到销毁的整个过程,之所以把这个过程称为生命周期是因为其就像一个生 ...
- Spring IOC详解 以及 Bean生命周期详细过程 可以硬刚面试官的文章
面试题 来自面试官发自灵魂深处的拷问:谈谈你对spring的理解: 一脸懵逼的求职者的内心活动:啥? 具体的问题是什么?现在的面试都不按套路出牌了吗? 抛出一个这么大的问题,你让我怎么回答? 一脸 ...
- 跟着小马哥学系列之 Spring IoC(源码篇:Bean 生命周期)
跟着小马哥学系列之 Spring IoC(源码篇:Bean 生命周期) 简介 Bean 元信息来源 Bean 元信息解析成 BeanDefinition 并注册 BeanDefinition 转变成 ...
- spring一: 容器以及bean生命周期
spring框架的几个优点: 1. 轻量级 2. 针对接口编程,解耦合 3. aop编程 4. 方便集成各种优秀框架 5.非侵入式 6.容器 IOC(Inversion of Cont ...
最新文章
- 《中国人工智能学会通讯》——8.2 自然界中的鸽群导航行为
- win7组策略-计算机配置,win7系统组策略设置系统配置模块的操作方法
- 31. 如何计算对象已死(引用计数器算法、可达性分析算法)32.对象是否可 GC?33. Minor GC 和 Full GC
- web开发软件,8个优秀的CSS实践,附面试题
- 获取 docker 容器(container)的 ip 地址
- 百度网络营销的神话?
- redis缓存数据的流程
- 基于WebQQ3.0协议写一个QQ机器人
- Oracle Enterprise Manager打不开的解决方法
- 多图像合成为延时视频的方法
- 13. Blade 模板引擎
- 约瑟夫问题c语言链表41人,约瑟夫问题 C语言链表实现
- 举个栗子!Tableau 技巧(184):查看固定或自定义时间段的数据
- python re.sub和lambda_【python学习笔记】 re.sub()
- window.open父子页面,子页面关闭回调事件样例
- 使用 Vue SVG 快速绘制曲线图(带动画)
- shift键计算机功能,分享新手必会的快捷键:shift键的11个妙用!
- Chrome浏览器命令行启动参数
- PAT 甲级 树(二)
- python之pip安装第三方库
热门文章
- PhotoMOS输出光电耦合器的概要
- 正则表达式 行首行尾替换
- 较新版本的git安装教程
- uni-App快速开发一个安卓应用
- FCN网络(Fully Convolutional Networks for Semantic Segmentation)
- 计算机应用基础0006 19春在线作业1,《计算机应用基础0006》19春在线作业1 为了实现自动控制处理 需要计算机具有的基础条件是...
- 【NVMe2.0b 6】NVMe 队列模型
- 【软件测试】python完成接口测试示例
- html中通过url地址传参及获取参数解析方法
- 关于抽象类和抽象方法