SpringBoot面试题整理(1)

news2025/1/4 18:40:58

面试整理

前置知识

  1. ApplicationContextInitializer
  2. ApplicationListener
  3. BeanFactory
  4. BeanDefinition
  5. BeanFactoryPostProcessor
  6. Aware
  7. InitializingBean/DisposableBean
  8. BeanPostProcessor
面试题
  1. SpringBoot启动流程
  2. IOC容器初始化流程
  3. Bean声明周期
  4. Bean循环依赖
  5. SpringMVC执行流程
ApplicationContextInitializer
  • IOC容器对象创建完成后执行,可以对上下文环境做一些操作,例如运行环境属性注册等
  • 如何使用
    1. 自定义,实现ApplicationContextInitializer接口
    2. 在MATA-INF/spring.factories配置文件中配置自定义的类
  • initialize方法什么时候执行
    • IOC容器对象创建完成后执行,常用语环境属性注册
ApplicationListener
  • 如何使用
    • 自定义类,实现ApplicationListener接口
    • 在META-INF/spring-factories配置文件中配置自定义的类
  • 什么时候执行
    • IOC容器发布事件后执行,通常用于资源加载,定时任务发布
BeanFactory
  • Bean容器的根接口,提供Bean对象的创建、配置、依赖注入等功能

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • ApplicationConfigServletServerApplicationContext->DefaultListableBeanFactory
BeanDefinition
  • 用于描述Bean,包括Bean的名称,Bean的属性,Bean的行为,实现的接口,添加的注解等,Spring中,Bean在创建之前,都需要封装成对应的BeanDefinition,然后根据BeanFinition进一步创建Bean对象

在这里插入图片描述

在这里插入图片描述

BeanFactoryPostProcessor
  • Bean工厂后置处理器,当BeanFactory准备好了后(Bean初始化前),会调用该接口的postProcessBeanFactory方法,经常用于新增BeanDefinition
实现类名作用
ConfigurationClassPostProcessor扫描启动类下所在包下的注解
ServletComponentRegisteringPostProcessor扫描@WebServler、@WebFilter、@WebListener
CachingMetadataReaderFactoryPostProcessor配置ConfiguraitonClassPostProcessor
ConfigurationWarningsPostProcessor配置警告提示

在这里插入图片描述

Aware
  • 感知接口,Spring提供的一种机制,通过实现该接口,重写方法,可以感知Spring应用程序执行过程中的一些变化。Spring会判断出当前的Bean有没有实现Aware接口,如果实现了,会在特定的时机回调接口对应的方法

    子接口名作用
    BeanNameAwareBean名称的感知接口
    BeanClassLoaderAwareBean类加载器的感知接口
    BeanFactoryAwareBean工厂的感知接口

    在这里插入图片描述

InitializingBean/DisposableBean
  • 初始化接口,当Bean被实例化好后,会回调里面的函数,经常用于做一些加载资源的工作

  • 销毁接口,当Bean被销毁执之前,会回调里面的函数,经常用于做一些释放资源的工作

    在这里插入图片描述

BeanPostProcessor
  • Bean的后置处理器,当Bean对象初始化之前以及初始化之后,会回调该接口对应的方法
    • postProcessBeforeInitialization:Bean对象初始化之前调用
    • postProcessAfterInitialization:Bean对象初始化之后调用
实现类名作用
AutowiredAnnotationBeanPostProcessor用来完成依赖注入
AbstractAutoProxyCreator用来完成代理对象的创建
AbstractAdvisingBeanPostProcessor将Aop中的通知作用于特定的Bean上

在这里插入图片描述

面试题

SpringBoot启动流程

  • new SpringApplication()
    1. 确认web应用的类型
    2. 加载ApplicationContextInitializer
    3. 加载ApplicationListener
    4. 记录主启动类
  • run()
    1. 准备环境对象Environment,用于加载系统属性等等
    2. 打印Banner
    3. 实例化容器Context
    4. 准备容器,为容器设置Environment、BeanFactoryPostProcessor,并加载主类对应的BeanDefinition
    5. 刷新容器(创建Bean实例)
    6. 返回容器

在这里插入图片描述

在这里插入图片描述

总结:

问:请聊聊SpringBoot启动的过程?

总:SpringBoot启动,其本质就是加载各种配置信息,然后初始化IOC容器并返回

分:在其启动的过程中会做这么几件事情:

​ 首先,当我们在启动类执行SpringApplication.run这行代码的时候,在它的方法内部其实会做两件事

​ 1.创建SpringApplication对象

​ 2.执行run方法

​ 其次,在创建StringApplication对象的时候,在它的构造方法内部主要做3件事情

​ 1.确认web应用类型,一般情况下是Servlet类型,这种类型的应用,将来会自动启动一个tomcat

​ 2.从spring.factories配置文件中,加载默认的ApplicationContextInitializer和ApplicationListener

​ 3.记录当前应用的主启动类,将来做包的扫描使用

​ 最后,对象创建好了以后,在调用该对象的run方法,在run方法的内部主要做4个事情

​ 1.准备Environment对象,它里面会封装一些当前应用运行环境的参数,比如环境变量等等

​ 2.实例化容器,这里仅仅是创建ApplicationContext对象

​ 3.容器创建好了以后,会为容器做一些准备工作,比如为容器设置Environment、 BeanFactoryPostProcessor后置处理器,并且加载主类对应的Definition

​ 4.刷新容器,就是我们常说的refresh,在这里会真正的创建Bean实例

总:总结一下我刚才说的,其实SpringBoot启动的时候核心就两步,创建SpringApplication对象以及run方法的调用,在run方法中会真正的实例化容器,并创建容器中需要的Bean实例,最终返回

IOC容器初始化流程

  • AbstractApplicationContext.refresh()
  1. 准备BeanFactory(DefaultListableBeanFactory)

    设置ClassLoader

    设置Environment

  2. 扫描要放入容器中的Bean,得到对应的BeanDefinition(只扫描,并不创建)

  3. 注册BeanPostProcessor

  4. 处理国际化

  5. 初始化事件多播器ApplicationEventMulticaster

  6. 启动Tomcat

  7. 绑定事件监听器和事件多播器

  8. 实例化非懒加载的单例Bean

  9. 扫尾工作,比如清空实例化时占用的缓存等

在这里插入图片描述

总结

问:请聊一聊IOC容器初始化的流程?

总:IOC容器的初始化,核心工作时在AbstractApplicationContext.refresh方法中完成的

分:在refresh方法中主要做了这么几件事

​ 1.准备BeanFactory,在这个一块需要给BeanFactory设置很多属性,比如类加载器、Environment等

​ 2.执行BeanFactory后置处理器,这一阶段会扫描要放入到容器中的Bean信息,得到应用的BeanDefinition(注意,这里只扫描不创建)

​ 3.是注册BeanPostProcessor,我们自定义的BeanPostProcessor就是在这个阶段被加载的,将来Bean地域性实例化好后需要用到的时候再创建

​ 4.启动tomcat

​ 5.实例化容器中实例化非懒加载的单例Bean,这里需要说的事,多例Bean和懒加载的Bean不会在这个阶段实例化,将来用到的时候再创建

​ 6.当容器事出花完毕后,再做一些扫尾工作,比如清除缓存等

总:简单总结一下,在IOC容器初始化的过程中,首先得准备并执行BeanFactory后置处理器,其次得注册Bean后置处理器,并启动tomcat,最后需要借助于BeanFactory完成Bean的实例化

Bean循环依赖

  • Bean循环依赖是指依赖闭环的问题

在这里插入图片描述

在这里插入图片描述

总结

问:请聊一聊Bean循环依赖是怎么实现的?

总:Bean的循环依赖指的是A依赖B,B又依赖A这样的依赖闭环问题。在Spring中,通过三个对象存储区来解决循环依赖问题,这三个缓存区被定义到了DefaultSingletonBeanRegistry中,分别是singletonObjects用来存储创建完毕的Bean,earlySingletonObjects用来存储未完成依赖注入的Bean,还有SingletonFactories用来存储创建Bean的ObjectFactory。假如说现在A依赖B,B依赖A,整个创建Bean的过程是这样的:

分:

​ 首先,调用A的构造方法实例化A,当前的A还没有处理依赖注入,暂且把它称为半成品,此时会把半成品A封装到一个ObjectFactory中,并存储到springFactories缓存区

​ 接下来,要处理A的依赖注入了,由于此时还没有B,所以得先实例化一个B,同样的,半成品B也会被封装到ObjectFactory中,并存储到springFactories缓存区

​ 紧接着,要处理B的依赖注入了,此时会找到springFactories中A对应的objectFactorty,调用它的getObject方法得到刚才实例化的半成品A(如果需要代理对象,则会自动创建代理对象),把得到的半成品A注入给B,并同时会把半成品A存入到earlySingletonObjects中,将来如果还有其他的类循环依赖了A,就可以直接从earlySingletonObjects中找到它了,那么此时springFactories中创建A的ObjectFactory也可以删除了

​ 至此,B的依赖注入处理完了后,就可以继续处理A的依赖注入了,把B注入给A,此时A也创建完了,就可以把A的对象存储到singletonObjects中,并同时删除掉earlySingletonObjects中的半成品A

​ 截此为止,A和B对象全部创建完毕,并存储到了singletonObjects中,将来通过容器获取对象,都是从singletonObjects中获取

总:总结起来就是一句话,借助于DefaultSingletonBeanRegistry的三个缓存区可以解决循环依赖问题

SpringMVC执行流程

  • Mvc接收到请求开始,到给浏览器做出响应之间的过程

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

总结面试

问:请聊一聊SpringMVC的执行流程?

总:

​ 使用了SpringMvc后,所有的请求都需要经过DispatcherServlet前端控制器,该类中提供了一个doDispatch方法,有关请求处理和结果响应的所有流程都在该方法中完成

分:

​ 首先,借助于HandlerMapping处理器映射器得到处理器执行链,里面封装了HandlerMethod代表目标Controller的方法,同时还通过一个集合记录了要执行的拦截器

​ 接下来,会根据HandlerMethod获取对应的HandlerAdapter处理器适配器,里面封装了参数解析器以及结果处理器

​ 然后,执行拦截器的perHandler方法

​ 接下来是核心,通过HandlerAdapter处理器适配器执行目标Controller方法,在这个过程中会通过参数解析器和结果处理器分别解析浏览器提交的数据以及处理Controller方法返回的结果

​ 然后,执行拦截器的postHandle方法

​ 最后处理响应,在这个过程中如果有异常抛出,会执行异常的逻辑,这里还会执行全局异常处理器的逻辑,并通过视图解析器viewResolver解析视图,再渲染视图,最后再执行拦截器的afterCompletion

​ 然后,执行拦截器的perHandler方法

​ 接下来是核心,通过HandlerAdapter处理器适配器执行目标Controller方法,在这个过程中会通过参数解析器和结果处理器分别解析浏览器提交的数据以及处理Controller方法返回的结果

​ 然后,执行拦截器的postHandle方法

​ 最后处理响应,在这个过程中如果有异常抛出,会执行异常的逻辑,这里还会执行全局异常处理器的逻辑,并通过视图解析器viewResolver解析视图,再渲染视图,最后再执行拦截器的afterCompletion

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1969536.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaEE 初阶(13)——多线程11之“定时器”

目录 一. 什么是“定时器” 二. 标准库的定时器 三. 定时器的实现 MyTimer 3.1 分析思路 1. 创建执行任务的类。 2. 管理任务 3. 执行任务 3.2 线程安全问题 四. 拓展 一. 什么是“定时器” 定时器是软件开发中的一个重要组件,类似于一个“闹钟”&#xff0…

【Spring】详细理解Spring中控制反转(IOC)和依赖注入(DI)的设计思想。

目录 1.相关概念 2. 设计IOC容器的两个主要接口 2.1 BeanFactory接口 2.2 ApplicationContext接口 2.3 两个接口的区别【面试题】 3. Bean对象的管理(控制反转) 3.1 基于XML文件管理bean对象 3.2 基于注解方式去管理【重点】 4. 依赖注入&#…

81.WEB渗透测试-信息收集-框架组件识别利用(5)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:80.WEB渗透测试-信息收集-框架组件识别利用(4) solr:…

第三方库jsoncpp

文章目录 0.jsoncpp库是做什么的?1.安装库2.有哪几个类,如何使用Json::Value类Json::Writer类-StreamWriterJson::Reader类-CharReader三者关系 3.使用样例将数据先存入Value类,再通过StreamWriter类转为Json格式的字符串获取到Json格式字符串…

6 postgresql事务与并发控制

事务与并发控制 事务可以理解为做一件事,数据库就是一件事要么做完,要么不做,不然这数据库给给人不可靠的感觉 正如解释事务具有四个重要特性:ACID(原子性,一致性,隔离性,持久性&a…

python实现提取视频帧的图片

文章目录 1、需求痛点2、完整代码⭐3、代码分析3.1、需要改动的地方3.2、OpenCV库的使用3.3、多线程技术 4、执行效率5、效果展示⭐6、注意事项🔺7、总结 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注…

3 IIC总线

3 IIC总线 1、基本概念1.1 IIC总线定义1.2 IIC总线协议概念 2 以AT24C02为例说明时序2.1 基本特性2.2 利用GPIO模拟IIC2.3 对AT24C02的操作2.4 重定向printf 1、基本概念 1.1 IIC总线定义 定义:两线式串行总线 两线式:说明处理器和外设之间只需两根信号…

【时间复杂度和空间复杂度】(内含超多实例练习)

【时间复杂度和空间复杂度】(内含超多实例练习) 1. 算法效率2. 时间复杂度2.1 时间复杂度的概念2.2 实例练习2.2.1 数组中搜索数据2.2.2 冒泡排序2.2.3 二分查找2.2.4 阶乘递归2.2.5 斐波那契递归 3. 空间复杂度3.1 空间复杂度的概念3.2 实例练习3.2.1 冒…

Set Hashset底层原理 LinkedSet底层原理 Treeset 31

不重复只执行一次,排序是小到大,色图是接口类 Hashset底层原理 LinkedSet底层原理 Treeset 总结

AI+云边端协同,EasyCVR视频汇聚技术赋能安防监控新生态

随着信息技术的飞速发展和数字化时代的到来,安防监控领域的技术也在不断创新和突破。EasyCVR平台的视频汇聚技术作为其中的佼佼者,以其强大的视频处理、汇聚与融合能力,在安防监控领域展现出了巨大的应用潜力和价值。本文将详细介绍EasyCVR视…

权限束缚术:windows工具自动化权限提升

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理利用工具全自动化提权的相关操作方法 因为我没有相关的环境复现,所以没有成功 不过复现的操作就是下面整理的操作 溢出漏洞提权原理 利用溢出漏洞提权,实际上就是一次判断过往的…

极简聊天室-websocket版

再写一个极简聊天室的websocket版,在本例中,websocket仅用于服务器向客户端传输信息,客户端向服务器发送信息是传统的http post方式,用axios来实现的,当然websocket本身是支持双向通信,主要是为了方便跟前面…

Selenium 无法定位元素的几种解决方案

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 1、frame/iframe表单嵌套 WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌的页面元素无法直接定位。 解决方法: d…

LLM大模型实战项目--基于ChatGLM2的小书虫文档阅读助手

本文介绍如此从零开始编写一个基于ChatGLM2的文档阅读助手 一、项目介绍 二、获取API接口 三、环境配置 四、代码实现 五、效果展示 一、项目介绍 小书虫📚 文档阅读助手是一个基于百度千帆大模型平台的Web应用程序,核心是清华大学训练的ChatGLM2大模…

算法加项目

1.仅加号 很简单&#xff0c;找到每次添加后最小的即可&#xff0c;这里不做演示。 2.采药 dp&#xff0c;for1数目&#xff0c;for2时间&#xff0c;简单的dp模板题目。 #include<bits/stdc.h> using namespace std; int n,m; const int N105,M105; long long a[M],b[M…

TInyWebServer面试题

一、项目介绍 &#xff08;1&#xff09;为什么要做这样一个项目&#xff1f; &#xff08;2&#xff09;介绍一下你的项目 这个项⽬是我在学习计算机⽹络和Linux socket编程过程中独⽴开发的轻量级Web服务器&#xff0c;服务器的⽹络模型是主从reactor加线程池的模式&#xf…

VMware虚拟机网络模式配置详解【原理,功能,特点层面】

VMware虚拟机网络模式配置详解【原理,功能,特点层面】 文章目录 VMware虚拟机网络模式配置详解【原理,功能,特点层面】桥接模式&#xff08;Bridged&#xff09;原理功能点介绍虚拟网络编辑器配置虚拟机配置 配置教程编辑-虚拟网络编辑器虚拟机网络配置 特点 NAT模式概念功能点…

数学建模--智能算法之蚁群优化算法

目录 基本原理 算法步骤 Python代码示例 应用领域 特点及改进 蚁群优化算法在解决哪些具体组合优化问题方面表现最为突出&#xff1f; 如何有效地改进蚁群优化算法以提高其收敛速度和避免陷入局部最优的问题&#xff1f; 蚁群优化算法与其他群体智能优化算法&#xff0…

三维旋转矩阵

前言 本文讲述三维旋转的矩阵推导&#xff0c;推导过程遵循下面的规则&#xff1a; 本文的坐标系是基于右手坐标系的逆时针旋转为正向旋转 围绕坐标轴的旋转 x x x轴 我们假设旋转的点为 P P P 假设旋转之前点 P P P的坐标为 ( x 0 , y 0 , z 0 ) (x_0,y_0,z_0) (x0​,y0​,…

CAN总线中注入拓展帧、远程帧,CAPL通用函数。

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe,博客目录大全,点击跳转👉 【测试需求】:CAN总线要求DUT 接收到非预期的扩展帧、远程帧时,通信正常,…