12.面试题——Spring Boot
1.Spring Boot是什么?
Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。
2.为什么要用 Spring Boot?
- 快速开发
- 快速整合第三方框架(Maven依赖关系,Maven继承)
- 简化XML的配置
- 内置嵌入HTTP服务器(Tomcat(默认)、Jetty),降低了对环境的要求
3.优点?
- 容易上手,提升开发效率,为 Spring 开发提供一个更快、更简单的开发框架
- 远离繁琐的配置
- 提供了一系列大型项目通用的非业务性功能,例如:内嵌服务器、安全管理、运行数据监控、运行状况检查和外部化配置等
- SpringBoot总结就是使编码变简单、配置变简单、部署变简单、监控变简单等等
4.缺点?
- Spring Boot 仅适用于全新 Spring 项目。将一个传统 Spring Framework 项目转换为 Spring Boot
应用程序是一个非常困难和耗时的过程 - 集成度较高,使用过程中不太容易了解底层(新人面试的时候都不会偏向于底层的东西,比如说 Spring MVC。建议在学习 Spring Boot 的时候,先去学习一下 Spring MVC)
5.Spring 和 Spring Boot 的不同?
- Spring Boot 本质上是 Spring 框架的延伸和扩展,它的诞生是为了简化 Spring框架初始搭建以及开发的过程,使用它可以不再依赖 Spring 应用程序中的 XML 配置,为更快、更高效的开发 Spring提供更加有力的支持。
- 更快速的构建能力:Spring Boot 提供了更多的 Starters 用于快速构建业务框架,Starters
可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring 及其他技术,而不需要到处找依赖包 - 起步依赖:在创建 Spring Boot
时可以直接勾选依赖模块,这样在项目初始化时就会把相关依赖直接添加到项目中,大大缩短了查询并添加依赖的时间 - 内嵌容器支持:Spring Boot 内嵌了 Tomcat、Jetty、Undertow 三种容器,其默认嵌入的容器是 Tomcat
- Actuator 监控:可以监控应用程序的运行状况,或者内存、线程池、Http 请求统计等
- 更快速的构建能力:Spring Boot 提供了更多的 Starters 用于快速构建业务框架,Starters
6.SpringBootApplication 引入了哪 3 个重要的注解?
核心注解是 @SpringBootApplication,它主要由@SpringBootConfiguration,@EnableAutoConfiguration和@ComponentScan这三个构成:
- @SpringBootConfiguration 里面就只有一个 @Configuration
主要注解,也就是把该类变成一个配置类所以@SpringBootConfiguration 就相当于 @Configuration - @EnableAutoConfiguration 是由 @AutoConfigurationPackage和@Import(EnableAutoConfigurationImportSelector.class) 这两个组成的@AutoConfigurationPackage 是自动配置包,包括了一个 @Import注解,给容器导入了自动配置包的注册器,AutoConfigurationPackages.Registrar.class:将主启动类的所在包及包下面所有子包里面的所有组件扫描到Spring 容器
- @ComponentScan:扫描包,该注解默认会扫描该类所在的包下所有的配置类
7.Spring Boot 的配置文件有哪几种格式?它们有什么区别?
主要有.properties 和 .yml
.yml 格式不支持 @PropertySource 注解导入配置
8.你如何理解 Spring Boot 中的 Starters
个人理解 Spring Boot 就是由各种 Starter 组合起来的,我们自己也可以开发Starter。
当一个项目变得相当复杂,管理依赖会成为一个噩梦,因为当中涉及太多 artifacts 了。
这时候 SpringBoot starter 就派上用处了。其他所需的依赖以一致的方式注入并且被管理。
所有的 starter 都归于 org.springframework.boot 组中,并且它们都以由 spring-boot-starter- 开头取名。这种命名方式使得我们更容易找到 starter 依赖,特别是当我们使用那些支持通过名字查找依赖的 IDE 当中。
SpringBoot 提供了非常多的 starter ,其中最常用的是:
- spring-boot-starter:核心 starter,包括自动化配置支持,日志以及 YAML
- spring-boot-starter-aop:Spring AOP 和 AspectJ 相关的切面编程 starter
- spring-boot-starter-data-jpa:使用 Hibernate Spring Data JPA 的 starter
- spring-boot-starter-jdbc:使用 HikariCP 连接池 JDBC 的 starter
- spring-boot-starter-security:使用 Spring Security 的 starter
- spring-boot-starter-test:SpringBoot 测试相关的 starter
- spring-boot-starter-web:构建 restful、springMVC 的 web应用程序的 starter
9.Spring Boot 可以兼容老 Spring 项目吗,如何做?
使用 @ImportResource 注解导入老 Spring 项目配置文件
10.Spring Boot 中读取配置的方式有哪些?
注入Environment对象:通过Environment 的 getProperty() 方法读取指定配置 Key 的内容
使用@Value注解,实现单个配置的注入
使用@ConfigurationProperties注解,实现一组配置的注入
11.SpringBoot 实现热部署有哪几种方式?
主要有两种方式:
- Spring Loaded
- Spring-boot-devtools
12.Spring Boot 是否可以使用 XML 配置 ?
Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过@ImportResource 注解可以引入一个 XML 配置
13、如何实现 Spring Boot 应用程序的安全性?
为了实现Spring Boot的安全性,我们使用 spring-boot-starter-security依赖项,并且必须添加安全配置。它只需要很少的代码。配置类将必须扩展WebSecurityConfigurerAdapter并覆盖其方法
14、运行 Spring Boot 有哪几种方式?
- 打包用命令或者放到容器中运行
- 用 Maven/ Gradle 插件运行
- 直接执行 main 方法运行
15.开启 Spring Boot 特性有哪几种方式
-
继承spring-boot-starter-parent项目
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.2</version><relativePath/> <!-- lookup parent from repository --></parent>
-
导入spring-boot-dependencies项目依赖
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.6.2</version></parent>
16.Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪一个?
Spring Boot 支持 Logging、Log4j2、Lockback 做为日志框架,若是你使用 Starters 启动器,Spring Boot 将使用 Logback 做为默认日志框架
17、Spring Initializr 是创建 Spring Boot 的唯一方法?
Spring Initiatlizr 让创建 Spring Boot 项目变的很容易,但是,也可以通过设置一个 maven 项目并添加正确的依赖项来开始一个项目
创建方式有两种:
- 第一种::start.spring.io 方式创建
- 第二种:在项目的标题为 “Basic Web Application” 处进行手动设置
18.Spring Boot 约定优于配置的体现是什么?
Maven的目录结构:
- 默认有 resources 文件夹存放配置文件
- 默认打包方式为jar
- 默认的配置文件:application.properties 或 application.yml 文件
- 默认通过 spring.profiles.active 属性来决定运行环境时的配置文件
- EnableAutoConfiguration 默认对于依赖的 starter 进行自动装载
- spring-boot-start-web 中默认包含 spring-mvc 相关依赖以及内置的 tomcat 容器,使得构建一个 web应用更加简单
19、内置容器的启动流程是什么
启动一个 Spring Boot项目,首先运行 Application 启动类的 main 方法,main 方法中调用了 SpringApplication.run 方法,run 方法中又调用了最核心的 refreshContext 方法,这里面又调用了我们最熟悉了 spring 容器启动模板方法refresh 方法,默认 Spring Boot 会启动 Tomcat,在 refresh 中的 onRefresh() 中执行;onRefresh 调用了 createWebServer() 方法,通过TomcatServletWebServerFactory 开始创建 Tomcat 实例;最后在 refresh 方法中的 finishRefresh() 中调用 Tomcat 实例的 start 逻辑,并将应用上下文发布的 webServer 中,至此完成 Tomcat 的启动
20、你如何理解 Spring Boot 配置加载顺序?
Spring Boot 配置加载顺序优先级是:propertiese文件、YAML文件、系统环境变量、命令行参数。
21、application.properties 和 bootstrap.properties 有何区别 ?
bootstrap 比 applicaton 优先加载,配置在应用程序上下文的引导阶段生效, 而且 boostrap 里面的属性不能被覆盖;application 用于 Spring Boot 项目的自动化配置
22、Spring Boot 中的监视器是什么?
Spring boot actuator 是 spring 启动框架中的重要功能之一,Spring boot 监视器可以访问生产环境中正在运行的应用程序的当前状态。监视器模块公开了一组可直接作为 HTTP URL 访问的 REST 端点来检查状态
23、如何使用 Spring Boot 实现异常处理?
Spring 通过使用 @ControllerAdvice 注解处理异常,实现一个ControllerAdvice 类来处理控制器类抛出的所有异常
24、YAML在springboot中的作用
使得 Spring Boot 配置文件更加有层次感,结构也比较清晰,不容易混淆,目前也是人类可读的数据序列化语言
25.Spring Boot 中如何实现定时任务 ?
在 Spring Boot 中使用定时任务主要有两种不同的方式,一个就是使用 Spring 中的 @Scheduled 注解,另一个则是使用第三方框架 Quartz。
使用 Spring 中的 @Scheduled 的方式主要通过 @Scheduled 注解来实现。
使用 Quartz ,则按照 Quartz 的方式,定义 Job 和 Trigger 即可
26.Spring Boot 自动配置的原理
- SpringBoot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration
- 查看@EnableAutoConfiguration,其作用是利用AutoConfigurationImportSelector给容器中导入一些组件
- 查看AutoConfigurationImportSelector,其中public String[] selectImports(AnnotationMetadata annotationMetadata)方法内最终调用getCandidateConfigurations()方法
- 查看 getCandidateConfigurations(AnnotationMetadata metadata,AnnotationAttributes attributes),获取候选的配置,这个是扫描所有jar包类路径下"META-INF/spring.factories"
- 然后把扫描到的这些文件包装成Properties对象
- 从properties中获取到EnableAutoConfiguration.class类名对应的值,然后把他们添加在容器中
整个过程就是将类路径下 “META-INF/spring.factories” 里面配置的所有 EnableAutoConfiguration 的值加入到容器中
27.SpringBoot核心配置文件是什么?
bootstrap.properties 和 application.properties
28.Spring Boot 打成的 jar 和普通的 jar 有什么区别
Spring Boot 打成jar包可以直接通过 java -jar *.jar 启动项目,但是不能够像普通 jar 包一样被其他项目引用。普通 jar 解压后就是包名,可以直接引用内部的类,而 Spring Boot 解压后 BOOT/classes 目录下才是真正的代码,因此不能被直接引用,如果需要被引用可以配置 pom,将 SpringBoot 打包成两个 jar 包,一个可执行,一个可引用
29.SpringBoot 常用注解
-
@SpringBootApplication: 它 封 装 了 核 心
的@SpringBootConfiguration+@EnableAutoConfiguration +@ComponentScan
这三个类,大大节省了程序员配置时间,这就是 SpringBoot 的核心设计思想. -
@EnableScheduling 是通过@Import 将 Spring 调度框架相关的bean 定义都加载到IoC 容器
-
@MapperScan:spring-boot支持mybatis组件的一个注解,通过此注解指定mybatis接口类的路径,即可完成对 mybatis 接口的扫描
-
@RestController 是 @Controller 和 @ResponseBody 的 结合, 一个类被加上@RestController 注解,数据接口中就不再需要添加@ResponseBody,更加简洁。
-
@RequestMapping,我们都需要明确请求的路径.
-
@GetMappping,@PostMapping, @PutMapping, @DeleteMapping 结合@RequestMapping 使用, 是 Rest 风格的, 指定更明确的子路径.
-
@PathVariable:路径变量注解,用{}来定义 url 部分的变量名.
-
@Service 这个注解用来标记业务层的组件,我们会将业务逻辑处理的类都会加上这个注解交给 spring 容器。事务的切面也会配置在这一层。当让 这个注解不是一定要用。有个泛指组件的注解,当我们不能确定具体作用的时候 可以用泛指组件的注解托付给spring 容器
-
@Component 和 spring 的注解功能一样, 注入到 IOC 容器中
-
@ControllerAdvice 和 @ExceptionHandler 配合完成统一异常拦截处理.
相关文章:
12.面试题——Spring Boot
1.Spring Boot是什么? Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。 2.为什么要用 …...

【前端VUE】npm i 出现版本错误等报错 简单直接解决命令
前端vue npm i 安装时出现 报错原因 在新版本的npm中,默认情况下,npm install遇到冲突的peerDependencies时将失败。 解决办法 使用--force或--legacy-peer-deps可解决这种情况。 --force 会无视冲突,并强制获取远端npm库资源࿰…...

精彩回顾 | 风丘科技亮相2024名古屋汽车工程博览会
2024年7月17日-19日,风丘科技联合德国IPETRONIK亮相日本名古屋汽车工程博览会。该展会面向汽车行业不同应用场景,包括新的eAxle、FCEV、ADAS、测试测量系统和ECU测试等相关技术,是一个专为活跃在汽车行业前线的工程师和研究人员举办的汽车技术…...

设计模式21-组合模式
设计模式21-组合模式(Composite Pattern) 写在前面 动机定义与结构定义结构主要类及其关系 C代码推导优缺点应用场景总结补充叶子节点不重载这三个方法叶子节点重载这三个方法结论 写在前面 数据结构模式 常常有一些组件在内部具有特定的数据结构。如何…...
如何选择深度学习的损失函数和激活函数
一概述 在深度学习中,损失函数(Loss Function)和激活函数(Activation Function)是两个至关重要的组件,它们共同影响着模型的训练效果和泛化能力。本文将简要介绍这两个概念,阐述选择它们的重要性…...

DATAX自定义KafkaWriter
因为datax目前不支持写入数据到kafka中,因此本文主要介绍如何基于DataX自定义KafkaWriter,用来同步数据到kafka中。本文偏向实战,datax插件开发理论宝典请参考官方文档: https://github.com/alibaba/DataX/blob/master/dataxPlug…...
Mybatis分页多表多条件查询
个人总结三种方式: Xml、queryWrapper、PageHelper第三方组件这三种方式进行查询; 方式一: xml中联表查询,在mapper中传参IPage<T>和条件Map(这里用map装参数)。 代码示例: Mapper层 M…...

SpringBoot快速入门(手动创建)
目录 案例:需求 步骤 1 创建Maven项目 2 导入SpringBoot起步依赖 3 定义Controller 4 编写引导类 案例:需求 搭建简单的SpringBoot工程,创建hello的类定义h1的方法,返回Hello SpringBoot! 步骤 1 创建Maven项目 大家&…...

C 408—《数据结构》算法题基础篇—数组(通俗易懂)
目录 Δ前言 一、数组的合并 0.题目: 1.算法设计思想: 2.C语言描述: 3.算法的时间和空间复杂度 : 二、数组元素的倒置 0.题目 : 1.算法设计思想 : 2.C语言描述 : 3.算法的时间和空间复杂度 : 三、数组中特定值元素的删除 0.题目 : …...
AI秘境-墨小黑奇遇记 - 初体验(一)
“怎么可能!”墨小黑盯着屏幕上的代码,整个人都不好了。调试了三遍,翻了几遍书,结果还是不对。就像你以为自己早起赶车,结果发现闹钟根本没响一样崩溃。 这是他第一次真正接触人工智能实战任务——实现一个简单的感知…...
文件IO813
标准IO文件定位: fseek函数: 功能:将stream流文件中的文件指针从whence位置开始偏移offset个字节的长度。 int fseek(FILE *stream , long offset, int whence); FILE *stream 指的是所需要定位的文件(文化定位前提是文件要被打…...

STP(生成树)的概述和工作原理
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…...

从AGV到立库,物流自动化的更迭与未来
AGV叉车 随着柔性制造系统的广泛应用,小批量、多批次的生产需求不断增强,“订单导向”生产已经成为趋势。这也让越来越多的企业认识到,产线的智能设备导入只是第一步,要想达到生产效率的最优解,物流系统的再优化必须提…...

阴阳脚数码管
1.小故事 最近,我接到了一个既“清肺”又“烧脑”的新任务,设计一个低功耗蓝牙肺活量计。在这个项目中我们借鉴了一款蓝牙跳绳的硬件设计方案,特别是它的显示方案——数码管。 在电子工程领域,初学者往往从操作LED开始ÿ…...
【Vue3-Typescript】<script setup lang=“ts“> 使用 ref标签 怎么获取 refs子组件呢
注意:请确保子组件已经正确挂载,并且通过 defineExpose 暴露了您想要在父组件中访问的属性或方法 parent.vue <template><child ref"childRef"></child><button click"fun">点击父组件</button> &l…...
npm 超详细使用教程
文章目录 一、简介二、npm安装三、npm 的使用3.1 npm初始化项目3.2 安装包3.3 安装不同版本包3.4 避免系统权限3.5 更新包3.6 卸载包3.7 执行脚本3.8 pre- 和 post- 脚本3.9 npm link3.10 发布和卸载发布的包3.11 使用npm版本控制3.22 npm资源 四、总结 一、简介 npmÿ…...
TypeScript函数
函数 函数:复用代码块 函数可以不写返回值 调用函数-----函数名() function a(){console.log(无参函数); } a();需要再函数后,写上返回值类型 没有返回值 使用void function e():string{return 可乐 } console.log(我得到了e()); function d():void{console.l…...

中海油某海上平台轨道巡检机器人解决方案
配电房作为能源传输和分配的核心枢纽,其安全运行直接影响到企业的生产稳定性和安全性。对于中海油这样的大型能源企业,配电房的运行状况至关重要。然而,传统的人工巡检方式存在效率低、作业风险高、巡检误差大等问题。为提升巡检效率、降低安…...

【NXP-MCXA153】SPI驱动移植
介绍 SPI总线由摩托罗拉公司开发,是一种全双工同步串行总线,由四个IO口组成:CS、SCLK、MISO、MOSI;通常用于CPU和外设之间进行通信,常见的SPI总线设备有:TFT LCD、QSPI FLASH、时钟模块、IMU等;…...
Python if 编程题|Python一对一辅导教学
你好,我是悦创。 以下为 if 编程练习题: 1. 奇数乘积问题 题目描述: 编写一个程序,判断给定的两个整数是否都是奇数,如果是,返回它们的乘积;如果不是,返回它们的和。输入: num1, num2输出: n…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...

GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...

6.9-QT模拟计算器
源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...