谈谈你对Spring Bean生命周期的理解【面试】

2023-05-16

前言

面试中经常会被问到Spring Bean的生命周期,有些人说记不住,看了一遍源码也是云里雾里的,那是因为只看理论,没有自己实践,如果自己亲自写代码验证一下,不管是对Spring的宏观感受,还是微观的感觉,都会有进一步的理解。
本篇会先展示代码的结果,后面再进行分析,代码的获取地址:码云地址

1、测试结果演示

Spring容器初始化===========================
五月 16, 2020 3:18:44 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@13b6d03: startup date [Sat May 16 15:18:44 CST 2020]; root of context hierarchy
五月 16, 2020 3:18:45 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
【步骤1】执行Bean的无参构造函数
【步骤2】执行Bean的set方法,设置name属性值:coolsummermoon
【步骤2】执行Bean的set方法,设置sex属性值:man
【步骤3】执行BeanNameAware中setBeanName方法,beanName值:iocBeanLifeService
【步骤4】执行BeanClassLoaderAware中setBeanClassLoader,ClassLoader的name = sun.misc.Launcher$AppClassLoader
【步骤5】执行BeanFactoryAware中setBeanFactory,beanFactory中是否包含IocBeanLifeServicetrue
【步骤6】执行EnvironmentAware的setEnvironment方法
【步骤7】执行ResourceLoaderAware的setResourceLoader方法,Resource File Name=applicationContext.xml
【步骤8】执行ApplicationEventPublisherAware中setApplicationEventPublisher方法
【步骤9】执行ApplicationContextAware的setApplicationContext方法,Bean Definition Names=[iocBeanLifeService, org.springframework.context.annotation.CommonAnnotationBeanPostProcessor#0, ioc.CustomerBeanPostProcessor#0]
【步骤10】执行BeanPostProcessor中postProcessBeforeInitialization方法,beanName=iocBeanLifeService
【步骤11】执行PostConstruct注解标注的方法
【步骤12】执行InitializingBean的afterPropertiesSet方法
【步骤13】执行配置的init-method
【步骤14】执行BeanPostProcessor的postProcessAfterInitialization方法,beanName=iocBeanLifeService
五月 16, 2020 3:18:45 下午 org.springframework.context.support.AbstractApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@13b6d03: startup date [Sat May 16 15:18:44 CST 2020]; root of context hierarchy
Spring容器初始化完毕========================
从容器中获取Bean
IocBeanLifeService{name='coolsummermoon', sex='man'}
Spring容器准备关闭==========================
【步骤15】执行preDestroy注解标注的方法
【步骤16】执行DisposableBean接口的destroy方法
【步骤17】执行配置的destroy-method
Spring容器完成关闭===========================

Process finished with exit code 0

2、结果分析

2.1、上面的结果,我们可以初步分四个阶段:

  1. Bean的实例化阶段
  2. Bean的设置属性阶段
  3. Bean的 初始化阶段
  4. Bean的销毁阶段

2.2、在初始化阶段,有个特别重要的接口BeanPostProcessor,在初始化前、后调用:
在这里插入图片描述
2.3、在设置属性阶段后,postProcessBeforeInitialization方法执行前,会执行很多Aware类型的接口,这种类型接口作用是加载资源到Spring容器中,Aware前面的名字就对应哪种资源,依次加载的是:

  1. BeanNameAware
  2. BeanClassLoaderAware
  3. BeanFactoryAware
  4. EnvironmentAware
  5. ResourceLoaderAware
  6. ApplicationEventPublisherAware
  7. ApplicationContextAware

看到这里应该明白BeanFactory和ApplicationContext的区别了:
BeanFactoryAware之前加载的资源都是公共的。BeanFactoryAware后面加载的资源都是ApplicationContext独有的。

2.4、初始化方式有三个,分别是:

  1. InitializingBean的afterPropertiesSet方法
  2. PostConstruct注解标注的方法
  3. 配置的init-method

上面的三个方法效果都是一样的,开发中选择其中一种方式就行,一般我们选择2、3方法中的一个。

2.5、容器销毁的方式有三个,分别是:

  1. preDestroy注解标注的方法
  2. DisposableBean接口的destroy方法
  3. 配置的destroy-method

上面的三个方法效果都是一样的,开发中选择其中一种方式就行,一般我们选择1、3方法中的一个。

3、总结

综合前面的代码和分析,现在我们用大白话描述下:

  1. Bean容器找到Spring配置文件中Bean的定义;
  2. Bean容器利用java 反射机制实例化Bean;
  3. Bean容器为实例化的Bean设置属性值;
  4. 如果Bean实现了BeanNameAware接口,则执行setBeanName方法;
  5. 如果Bean实现了BeanClassLoaderAware接口,则执行setBeanClassLoader方法;
  6. 如果Bean实现了BeanFactoryAware接口,则执行setBeanFactory方法;
  7. 如果 ……真的,到这我经常忘记,但前面三个Aware接口肯定能记住;
  8. 如果Bean实现了ApplicationContextAware接口,则执行setApplicationContext方法;
  9. 如果加载了BeanPostProcessor相关实现类,则执行postProcessBeforeInitialization方法;
  10. 如果Bean定义初始化方法(PostConstruct注解、配置init-method、实现了InitializingBean接口),则执行定义的初始化方法;
  11. 如果加载了BeanPostProcessor相关实现类,则执行postProcessAfterInitialization方法;
  12. 当要销毁这个Bean时,如果自定义了销毁方法(PreDestroy注解、配置destroy-method、实现了DisposableBean接口),则执行定义的销毁方法。

结束语

留一个思考题:作用域是单例和原型的Bean,Spring对其生命周期是如何管理的?

欢迎大家关注下方微信公众号,我们一起讨论技术、理财方面的知识,解决生活中遇到的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

谈谈你对Spring Bean生命周期的理解【面试】 的相关文章

  • grub2下常见系统初始化错误的分析和解决

    原文连接http tieba baidu com p 2910461207 grub rescue gt grub gt initramfs 是开机错误时 xff0c 常见到的状况 我将分以下几个部份说明 xff1a 一 开机出现 grub
  • MSP-EXP430F5529LP: Error initializing emulator: No USB FET was found

    正常情况下 xff0c 安装了CCS之后 xff0c TI MSP430LaunchPad的驱动都可以自动安装好 主要是 xff1a MSP Application UART 和 MSP Debug Interface 当然 xff0c 非
  • CMakeLists.txt加载第三方库

    生成一个库文件 TgMath h ifndef TGMATH H define TGMATH H include 34 tgmath global h 34 class TGMATHSHARED EXPORT TgMath public T
  • ROS学习之订阅消息——Subscriber_代码分析

    接上篇 xff1a ROS学习之发布消息 Publisher 详解版本 xff1a 本代码文件名为 xff1a subscriber cpp include 34 ros ros h 34 include 34 std msgs Strin
  • LXC 介绍

    转自 xff1a https www cnblogs com xidongyu p 5767020 html LXC又名Linux container xff0c 是一种虚拟化的解决方案 xff0c 这种是内核级的虚拟化 主流的解决方案Xe
  • openstack原生网络和SDN网络对比

    1 原生Neutron架构图 xff1a 2 Networking odl的架构 3 ODL 处理过程 当OpenStack Neutron API接收到用户创建网络等操作请求 xff0c 它会调用ML2的相关方法 ML2已经定义了post
  • 树莓派 Raspberry Pi 3B+安装官方系统(一)

    两年前购买的树莓派 xff08 可看当时我的记录树莓派 3B 43 重装系统并配置 WiFi YouForever xff09 已经在角落里吃灰了好长时间 xff0c 一度以为已经损坏 xff0c 几天前试着拿出来折腾一下 xff0c 竟然
  • Rime——最好的输入法

    同步发布在博客 xff1a https www zhyong cn 9422 最近迷上了五笔输入法 xff0c 于是想找一款好用的五笔输入法软件 xff0c 最终确定鼎鼎大名的Rime输入法 一款跨平台的开源输入法 xff0c 支持Wind
  • Haar特征描述算子-人脸检测

    Haar特征描述算子 人脸检测 详细资料 3 1简介 Haar like特征最早是由Papageorgiou等应用于人脸表示 xff0c 在2001年 xff0c Viola和Jones两位大牛发表了经典的 Rapid Object Det
  • HTML(css+div)登录界面

    xff08 1 xff09 这是当时做的一个课程设计 xff0c 很多人想要图片 xff0c 在这里我把用到的所有图片资源分享下 xff08 2 xff09 链接 xff1a https pan baidu com s 1nUX1DQe a
  • 基于Matlab的GPU加速---for循环处理

    采用GPU加速时 xff0c 如遇for循环 xff0c 则很容易增加代码在GPU上运行的时间开销 在编程时 xff0c 使用矩阵和向量操作或arrayfun bsxfun pagefun替换循环操作来向量化代码 1 arrayfun函数
  • android ndk extern "C"

    C 43 43 的代码里面 xff1a extern 34 C 34 这是因为生成的二进制文件中 xff0c C和C 43 43 的符号表不相同造成的 Jni是按照C的生成规则去找函数的 xff0c 所以要加上extern C使编译器把函数
  • AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图

    目前因为做人脸识别的一个小项目 xff0c 用到了AdaBoost的人脸识别算法 xff0c 因为在网上找到的所有的AdaBoost的简介都不是很清楚 xff0c 让我看看头脑发昏 xff0c 所以在这里打算花费比较长的时间做一个关于Ada
  • 智能驾驶仿真场景构建技术

    随着汽车智能化程度的不断提高 xff0c 智能汽车通过环境传感器与周边行驶环境的信息交互与互联更为密切 xff0c 需应对的行驶环境状况也越来越复杂 xff0c 包括行驶道路 周边交通和气象条件等诸多因素 xff0c 具有较强的不确定性 难
  • Web应用程序的身份验证:Session认证、Token认证

    一 Web应用程序的身份验证 1 Session认证 用户向服务器发送用户名和密码 服务器验证通过后 xff0c 在当前对话 xff08 session xff09 里面保存相关数据 xff0c 如用户角色 xff0c 登陆时间等 服务器向
  • 计算机视觉: 物体分类,场景分类,事件分类

    主要总结一下最近看的几篇场景分类文献 xff0c 顺便总结场景 物体和事件分类的关系 1 ILSVRC 2015 Scene Classi cation Challenge 冠军 xff0c 主要贡献是Relay Backpropagati
  • CSS | 替换元素(可置换元素)

    替换元素 定义 xff1a 可替换元素是指元素内容的展现不是由 CSS 来控制的 xff0c 而是外观渲染独立于 CSS 的外部对象 详见 xff1a MDN 典型的可替换元素有 xff1a lt img gt lt iframe gt l
  • 输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数

    输入一个int型整数 xff0c 按照从右向左的阅读顺序 xff0c 返回一个不含重复数字的新的整数 输入 xff1a 输出代码 xff1a 输入 xff1a 9876673 输出 37689 代码 xff1a int span class
  • 树莓派温度检测

    树莓派温度检测 一 shell命令 登录树莓派之后使用指令查看CPU温度 xff0c 依次输入以下指令 xff1a 进入目录 cd sys class thermal thermal zone0 查看温度 cat temp 树莓派返回 47
  • PX4学习(1)——PX4固件版本开发环境(ROS+mavros版本)

    参考px4官网流程 xff1a https dev px4 io en setup dev env linux ubuntu html https dev px4 io en setup building px4 html 配置过程中网速一

随机推荐

  • 一个操作,轻松迁移 Maven 至 Gradle

    今天我们来讲讲如何将 Maven 项目转换为 Gradle 项目 这个过程还是蛮简单的 xff0c 下面通过一个例子来说明怎么转换 Gradle 设置 如果没有安装 gradle xff0c 我们可以从 Gradle 官网下载最新的版本 x
  • 不同域名访问显示不同备案号

    lt a href 61 34 http beian miit gov cn 34 id 61 34 BeiAnHao 34 style 61 34 color 999999 34 target 61 34 blank 34 gt 鲁ICP
  • Word文档从第N页开始显示页眉或页脚的方法

    1 打开想要设置页眉页脚的word文档 2 假如想从第三页开始设置页眉 xff0c 就把光标选在在第二页末尾 xff0c 点击菜单栏 页面布局 xff0c 找到 分隔符 里子选项 分节符 xff0c 下一页 把文档分成两节 xff08 以O
  • xampp 访问出现New XAMPP security concept

    New XAMPP security concept Access to the requested directory is only available from the local network This setting can b
  • Runtime error 216 at xxx 故障解决一例

    故障现象 xff1a 部分Delphi项目在win7开发机上不能运行了 xff0c 提示Runtime error 216 at xxx错误信息 xff0c 但是将出错的EXE文件复制到别的win7和xp下 xff0c 均运行正常 解决办法
  • 启用了TRACE 和TRACK HTTP 方法,如何禁用?

    http wenku baidu com view 557d761ea8114431b90dd873 html http wenku baidu com view de1f4ad2195f312b3169a50d html http www
  • IP地址表示方法及网段子网掩码写法

    A类IP段 0 0 0 0 到127 255 255 255 B类IP段 128 0 0 0 到191 255 255 255 C类IP段 192 0 0 0 到223 255 255 255 XP默认分配的子网掩码每段只有255或0 xf
  • ftp连接错误——服务器发回了不可路由的地址。使用服务器地址代替。

    设置filezilla客户端的连接参数 选中某一连接项高级 加密 只使用普通ftp传输设置 传输模式 主动重新连接
  • VNC内网穿透--MAC控制windos

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言SSH和VNCSSHSSH服务端SSH客户端 VNCVNC serverVNC viewer 内网穿透花生壳 前言 翻出很久
  • Excel 2016双击文件打开为空白的解决办法

    故障描述 xff1a 安装Office 2016后 xff0c 双击EXCEL文件打开后显示为空白 解决办法 xff1a 开始 运行 regedit 修改HKEY CLASSES ROOT Excel Sheet 12 shell Open
  • Linux 修改远程默认端口(22)

    如题 xff1a 在此前 xff0c 建议先查看redhat的release版本 xff0c CentOS 7的启动服务不同 xff1a more etc redhat release 正文 xff1a 1 编辑sshd配置 xff0c 修
  • pytorch环境配置(装cuda、cudnn)win10+cuda10.1+cudnn7.6.5+torch1.7.1 && 集显装pytorch

    为了装这个走了太多坑了 xff0c 所以想写一篇具体教程 xff0c 有缘人看吧 xff0c 希望能解决你的问题 xff08 第一次写文章啥也不懂 xff0c 万一冒犯了啥 xff0c 麻烦告知我改 xff09 我anaconda很早就装过
  • APM无人机软件在环仿真环境搭建

    题记 xff1a 最近做毕业设计得用到无人机仿真 xff0c 重操旧业 xff0c 搞一搞SITL仿真 给个传送门参考 xff1a 无人机SITL仿真 APM软件在环仿真 我的环境 xff1a ubuntu18 04虚拟机 1 官方教程 a
  • 无人机导航中的各类坐标系

    无人机中的各类坐标系学习笔记 xff1a 北东地坐标系 NED north east down 东北天 ENU east north up 机体坐标系 body frame 1 导航中的坐标系理解 重要参考 导航中 xff0c 最重要的两个
  • 有了Systick中断为什么还要PendSV中断?

    文章目录 问题 xff1a 原因 xff1a 1 在SysTick中断里完成任务切换会降低操作系统的实时性 xff1a 2 把systick优先级设置为最高把PendSV设置为最低的好处 xff1a 3 结语 xff1a 问题 xff1a
  • OpenCV/caffe安装流程

    公司正在做人脸识别系统 xff0c 用到了OpenCV库 xff0c 下面就是根据网上资料以及自己多次部署安装的经验整理的安装流程 xff0c 希望能给一些人一点参考 系统 xff1a Ubuntu1604 CPU架构 xff1a 一般是x
  • win10远程桌面连接ubuntu18.04

    一开始 xff0c 我是根据这个教程进行操作的 xff0c 改了设置为共享 xff0c 安装xrdp等 xff0c 一切都完成后 xff0c 当进行连接时 xff0c 也会出现那个xrdp连接界面 xff0c 但只要一登陆 xff0c 界面
  • 机器学习算法知识点整理

    1生成模型generative model和判别模型 discriminative model 已知输入变量x xff0c 生成模型通过对观测值和标注数据计算联合概率分布P x y 来达到判定估算y的目的 判别模型通过求解条件概率分布P y
  • 我的2014年总结——奔波的一年

    2014年 xff0c 发生了一些人生的大事 xff0c 这些事既有忧 xff0c 又有喜 这因为有这些事情的发生 xff0c 所以我们才越发成熟 xff0c 越发稳重 2014年技术的提升没有前2年那么突飞猛进了 xff0c 生活的事情也
  • 谈谈你对Spring Bean生命周期的理解【面试】

    前言 面试中经常会被问到Spring Bean的生命周期 xff0c 有些人说记不住 xff0c 看了一遍源码也是云里雾里的 xff0c 那是因为只看理论 xff0c 没有自己实践 xff0c 如果自己亲自写代码验证一下 xff0c 不管是