【面试题】Spring/SpringBoot部分[2025/1/6 ~ 2025/1/12]

Spring/SpringBoot部分[2025/1/6 ~ 2025/1/12]

  • 1. 说说 Spring 启动过程?
  • 2. 说说 Springboot 的启动流程?
  • 3. 你了解的 Spring 都用到哪些设计模式?
  • 4. Spring 有哪几种事务传播行为?
  • 5. SpringBoot 是如何实现自动配置的?
  • 6. Spring Boot 是如何通过 main 方法启动 web 项目的?
  • 7. Spring Boot 的核心特性有哪些?

1. 说说 Spring 启动过程?

首先加载配置文件, 初始化Spring容器ApplicationContext; 扫描Bean定义获取BeanDefinition; 解析BeanDefinition实例化Bean, 注入依赖, 处理Bean周期初始化方法: InitializingBean和BeanPostProcessor, 发布一些时间比如容器启动事件, 完成启动

  1. 加载配置文件,初始化容器:Spring 启动时首先会读取配置文件(如 XML 配置文件、Java Config 类等),包括配置数据库连接、事务管理、AOP 配置等。
  2. 实例化容器:Spring 根据配置文件中的信息创建容器 ApplicationContext,在容器启动阶段实例化 BeanFactory,并加载容器中的 BeanDefinitions。
  3. 解析 BeanDefinitions:Spring 容器会解析配置文件中的 BeanDefinitions,即声明的 Bean 元数据,包括 Bean 的作用域、依赖关系等信息。
  4. 实例化 Bean:Spring 根据 BeanDefinitions 实例化 Bean 对象,将其放入容器管理。
  5. 注入依赖:Spring 进行依赖注入,将 Bean 之间的依赖关系进行注入,包括构造函数注入、属性注入等。
  6. 处理 Bean 生命周期初始化方法:Spring 调用 Bean 初始化方法(如果有定义的话),对 Bean 进行初始化。 如果 Bean 实现了 InitializingBean 接口,Spring 会调用其 afterPropertiesSet 方法。
  7. 处理 BeanPostProcessors:容器定义了很多 BeanPostProcessor,处理其中的自定义逻辑,例如 postProcessBeforeInitialization 会在 Bean 初始化前调用, postProcessAfterInitialization 则在之后调用。 Spring AOP 代理也在这个阶段生成。
  8. 发布事件:Spring 可能会在启动过程中发布一些事件,比如容器启动事件。
  9. 完成启动:当所有 Bean 初始化完毕、依赖注入完成、AOP 配置生效等都准备就绪时,Spring 容器启动完成。

2. 说说 Springboot 的启动流程?

  1. 启动 main() 方法: 应用从 main() 方法启动,并通过 SpringApplication.run() 引导应用启动。
  2. 创建SpringApplication: 应用会创建SpringApplication 对象,推断应用类型、设置初始化器、设置启动监听器、确定主应用类。
  3. 准备环境(ConfigurableEnvironment): Spring Boot 在启动过程中准备应用环境加载配置文件系统环境变量以及命令行参数。
  4. 创建并刷新 ApplicationContext: 创建应用上下文ApplicationContext,加载配置类和自动配置类,注册 Bean 并执行依赖注入等初始化操作(InitializingBean和BeanPostProcessors)。
  5. 在刷新上下文时启动嵌入式 Web 服务器: 于 Web 应用,Spring Boot 会自动启动嵌入式 Web 容器(如 Tomcat),并注册相关的 Servlet 和 Filter`。
  6. 发布应用已启动事件: 对应监听 stated 事件逻辑会被触发
  7. 执行 CommandLineRunner 和 ApplicationRunner: 在应用启动完成后,执行实现了 CommandLineRunner 和 ApplicationRunner 接口的初始化逻辑。
  8. 发布 ready 事件、应用启动完成: 触发 ApplicationReadyEvent,应用进入运行状态,处理业务请求或任务。

3. 你了解的 Spring 都用到哪些设计模式?

  1. 工厂模式,从名字就能看出来是 BeanFactory,整个 Spring IOC 就是一个工厂。
  2. 模板方法,例如 JdbcTemplate、RestTemplate,名字是 xxxTemplate 的都是模板。
  3. 代理模式,AOP 整个都是代理模式。
  4. 单例模式,默认情况下 Bean 都是单例的。
  5. 责任链模式,比如 Spring MVC 中的拦截器,多个拦截器串联起来就形成了责任链。
  6. 观察者模式,在 Spring 中的监听器实现。
  7. 适配器模式,在 Spring MVC 中提到的 handlerAdapter 其实就是适配器。

4. Spring 有哪几种事务传播行为?

  1. PROPAGATION_REQUIRED(默认)(有用, 没有new) 如果当前存在事务,则用当前事务,如果没有事务则新起一个事务
  2. PROPAGATION_SUPPORTS(有用, 没有不用) 支持当前事务,如果不存在,则以非事务方式执行
  3. PROPAGATION_NOT_SUPPORTED(不用) 不支持当前事务,始终以非事务方式执行
  4. PROPAGATION_MANDATORY(必须有) 支持当前事务,如果不存在,则抛出异常
  5. PROPAGATION_NEVER(必须没有) 不支持当前事务,如果当前存在事务,则抛出异常
  6. PROPAGATION_REQUIRES_NEW(始终new) 创建一个新事务,如果存在当前事务,则挂起当前事务
  7. PROPAGATION_NESTED(嵌套事务) 如果当前事务存在,则在嵌套事务中执行,内层事务依赖外层事务,如果外层失败,则会回滚内层,内层失败不影响外层。

5. SpringBoot 是如何实现自动配置的?

Spring Boot 的自动配置是通过 @EnableAutoConfiguration 注解实现,这个注解包含@Import({AutoConfigurationImportSelector.class})注解,导入的这个类会去扫描 classpath 下所有的 META-INF/spring.factories 中的文件,根据文件中指定的配置类加载相应的 Bean 的自动配置。 这些 Bean 通常会使用 @ConditionalOnClass、@ConditionalOnMissingBean、@ConditionalOnProperty 等条件注解。来控制自动配置的加载条件,例如仅在类路径中存在某个类时,才加载某些配置。

6. Spring Boot 是如何通过 main 方法启动 web 项目的?

  • SpringApplication.run():这是启动的入口,它会创建 Spring 应用上下文,并执行自动配置。
  • 创建应用上下文:为 Web 应用创建 AnnotationConfigServletWebServerApplicationContext 上下文。
  • 启动内嵌 Web 服务器:在 refreshContext() 阶段启动内嵌的 Web 服务器(如 Tomcat)。
  • 自动配置:通过 @EnableAutoConfiguration 自动配置各种组件,如 DispatcherServlet。
  • 请求处理:内嵌的 DispatcherServlet 负责处理 HTTP 请求。

7. Spring Boot 的核心特性有哪些?

  1. 开箱即用,内嵌服务器。这个特点是程序员最直观的感受,相较于原本的开发,spring boot 可以省略以前繁琐的 tomcat 配置,快速创建一个 web 容器。
  2. 自动化配置。在 spring boot 中我们可以按照自动配置的规定(将自动加载的 bean 写在自己jar 包当中的 meta/info/spring.factories 文件中或者通过的注解 @Import 导入时加载指定的类)这样我们的配置类就会被 Springboot 自动加载到容器当中。 同时还支持通过改写yaml 和 propreties来覆盖默认配置
  3. 支持 jar 包运行。传统部署web 容器都是打成 war 包放在 tomcat 中。spring boot 可以打成 jar 包只要有 java 运行环境即可运行 web 容器。
  4. 监控、健康检查支持。spring boot Actuator 支持开发者监控应用的运行状态,包括性能指标、应用信息和日志级别控制等。
  5. 完整的生态支持。spring boot 可以随意整合 spring 全家桶的支持。像 Actuator 健康检查模块,Spring Data JPA 数据库模块,Spring Test 测试模块。这些都可以很优雅的集成在 springboot 当中。

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

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

相关文章

【STM32-学习笔记-6-】DMA

文章目录 DMAⅠ、DMA框图Ⅱ、DMA基本结构Ⅲ、不同外设的DMA请求Ⅳ、DMA函数Ⅴ、DMA_InitTypeDef结构体参数①、DMA_PeripheralBaseAddr②、DMA_PeripheralDataSize③、DMA_PeripheralInc④、DMA_MemoryBaseAddr⑤、DMA_MemoryDataSize⑥、DMA_MemoryInc⑦、DMA_DIR⑧、DMA_Buff…

SQL Server中可以通过扩展事件来自动抓取阻塞

在SQL Server中可以通过扩展事件来自动抓取阻塞,以下是详细流程: 开启阻塞跟踪配置: • 执行以下SQL语句来启用相关配置: EXEC sp_configureshow advanced options, 1; RECONFIGURE; EXEC sp_configure blocked process thresh…

【爬虫】单个网站链接爬取文献数据:标题、摘要、作者等信息

源码链接: https://github.com/Niceeggplant/Single—Site-Crawler.git 一、项目概述 从指定网页中提取文章关键信息的工具。通过输入文章的 URL,程序将自动抓取网页内容 二、技术选型与原理 requests 库:这是 Python 中用于发送 HTTP 请求…

关于扫描模型 拓扑 和 传递贴图工作流笔记

关于MAYA拓扑和传递贴图的操作笔记 一、拓扑低模: 1、拓扑工作区位置: 1、准备出 目标 高模。 (高模的状态如上 ↑ )。 2、打开顶点吸附,和建模工具区,选择四边形绘制. 2、拓扑快捷键使…

解决无法远程管理Windows Server服务器核心安装

问题 有时,人们会为了节省运算资源,例如运行Hyper-V虚拟机,而选择Windows Server核心安装,即无图形化界面。这时,我们就只能通过Powershell命令对其进行操控,或为了获得图形化界面而使用远程服务器管理工具…

【计算机网络】lab7 TCP协议

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀计算机网络_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 实验目的…

JavaRestClient 客户端初始化+索引库操作

1. 介绍 ES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请求发送给ES。 Elasticsearch目前最新版本是8.0,其java客户端有很大变化。不过大多数企业使用的还是8以下版本 2. 客户端初始化 在elastic…

【JVM-2.2】使用JConsole监控和管理Java应用程序:从入门到精通

在Java应用程序的开发和运维过程中,监控和管理应用程序的性能和资源使用情况是非常重要的。JConsole是Java Development Kit(JDK)自带的一款图形化监控工具,它可以帮助开发者实时监控Java应用程序的内存、线程、类加载以及垃圾回收…

基于html5实现音乐录音播放动画源码

源码介绍 基于html5实现音乐录音播放动画源码是一款类似Shazam的UI,点击按钮后,会变成为一个监听按钮。旁边会有音符飞入这个监听按钮,最后转换成一个音乐播放器。 效果预览 源码获取 基于html5实现音乐录音播放动画源码

《自动驾驶与机器人中的SLAM技术》ch1:自动驾驶

目录 1.1 自动驾驶技术 1.2 自动驾驶中的定位与地图 1.1 自动驾驶技术 1.2 自动驾驶中的定位与地图 L2 在技术实现上会更倾向于实时感知,乃至可以使用感知结果直接构建鸟瞰图(bird eye view, BEV),而 L4 则依赖离线地图。 高精地…

【LeetCode】:删除回文子数组【困难】

class Solution { public:// 思考:能否用滚动数组进行优化int minimumMoves(vector<int>& arr) {// 定义状态dp[i][j]为i-j的最小步数int n arr.size();vector<vector<int>> dp(n, vector<int>(n, 1e9 7));// 可以把这 1 次理解为一种 最小操作单…

ChatGPT入门之文本情绪识别:先了解LSTM如何处理文字序列

文章目录 0. 首先聊聊什么是RNN1. 理解LSTM&#xff0c;从数据如何喂给 LSTM开始2. LSTM每个门是如何处理序列数据的&#xff1f;2.1 遗忘门&#xff08;Forget Gate&#xff09;&#xff1a;该忘掉哪些信息&#xff1f;2.2 输入门&#xff08;Input Gate&#xff09;&#xff…

AI学习路线图-邱锡鹏-神经网络与深度学习

1 需求 神经网络与深度学习 2 接口 3 示例 4 参考资料

C#用直线和曲线抗锯齿

使用 GDI 绘制一条线时&#xff0c;要提供线条的起点和终点&#xff0c;但不必提供有关线条上各个像素的任何信息。 GDI 与显示驱动程序软件协同工作&#xff0c;确定将打开哪些像素以在特定显示设备上显示该线条。 效果对比 代码实现 关键代码 e.Graphics.SmoothingMode Sm…

【opencv】第8章 图像轮廓与图像分割修复

8.1 查找并绘制轮廓 一个轮廓一般对应一系列的点&#xff0c;也就是图像中的一条曲线。其表示方法可能 根据不同的情况而有所不同。在OpenCV 中&#xff0c;可以用findContours()函数从二值图 像中查找轮廓 8.1.1 寻找轮廓&#xff1a; findContours() 函数 findContours) 函…

Unity 大地图功能 离线瓦片地图

不使用第二个摄像机实现类似开放世界的大地图功能。 功能如下&#xff1a; 按下M键打开/关闭大地图功能 打开大地图时&#xff0c;默认玩家位置居中 大地图支持拖拽&#xff0c;可调节拖拽速度&#xff0c;支持XY轴翻转 支持大地图设置边缘偏移量 可设置是否启动拖拽边界 …

Bootstrap 前端 UI 框架

Bootstrap官网&#xff1a;Bootstrap中文网 铂特优选 Bootstrap 下载 点击进入中文文档 点击下载 生产文件是开发响应式网页应用&#xff0c;源码是底层逻辑代码&#xff0c;因为是要制作响应式网页&#xff0c;所以下载开发文件 引入 css 文件&#xff0c; bootstrap.css 和 …

error: linker `link.exe` not found

开始学习rust&#xff0c;安装好rust的环境&#xff0c;开始从hello world开始&#xff0c;结果用在win10环境下&#xff0c;使用vs code或cmd窗口编译rust报错&#xff1a; PS E:\study_codes\rust-demo\chart01> rustc hello.rs error: linker link.exe not found| note:…

django基于Python的校园个人闲置物品换购平台

Django 基于 Python 的校园个人闲置物品换购平台 一、平台概述 Django 基于 Python 的校园个人闲置物品换购平台是专为校园师生打造的一个便捷、环保且充满活力的线上交易场所。它借助 Django 这一强大的 Python Web 开发框架&#xff0c;整合了校园内丰富的闲置物品资源&…

【Vim Masterclass 笔记10】S06L23:Vim 核心操作训练之 —— 文本的搜索、查找与替换操作(第二部分)

文章目录 S06L23 Search, Find, and Replace - Part Two1 文本替换命令 :s/old/new/2 指定范围的文本替换3 特例&#xff1a;路径的替换4 文件行号的配置5 要点总结&#xff08;1&#xff09;搜索当前行&#xff08;Same Line Searching&#xff09;&#xff08;2&#xff09;跨…