文档章节

Spring Boot 必问面试题精选

码农小胖哥
 码农小胖哥
发布于 10/13 23:15
字数 2679
阅读 63
收藏 1

1.简介

自Spring Boot诞生以来,就引起了业界轰动,目前越来越多的公司技术选型选择拥抱Spring Boot。所以Spring Boot也成为面试必问的问题之一。接下来小胖哥总结了一些来开阔你的思路。

2.问题

好了接下来直奔主题说说经常在面试中问到的 **Spring Boot **面试题

Q1。Spring和Spring Boot有什么区别?

Spring Framework提供了多种功能,使Web应用程序的开发更加容易。这些功能包括依赖注入,数据绑定,面向方面的编程,数据访问等等。 随着Spring社区的壮大,Spring慢慢变得越来越复杂,不再像开始宣称的那么轻量级。 开发应用程序的配置量越来越大令开发者头疼。这时Spring Boot就派上用场了 - 它采用“约定大于配置”的思想简化了配置,对Spring提供的功能和配置而且将一些功能抽象成为“Starter”开箱即用、按需引用。极大地简化了开发。

Q2。我们如何使用Maven设置Spring Boot应用程序?

我们可以像在任何其他库中一样在Maven项目中包含Spring Boot。但是,最好的方法是从spring-boot-starter-parent项目继承并声明依赖于Spring Boot启动器。这样做可以让我们的项目重用Spring Boot的默认设置。 继承spring-boot-starter-parent项目非常简单 - 我们只需要在 pom.xml 中指定一个 parent 元素:

file

我们可以在Maven 中央仓库找到最新版本的 spring-boot-starter-parent。 上面的方式很方便但是并不一定符合实际需要。例如公司要求所有项目依赖构建从一个标准BOM开始,我们就不能按上面的方式进行。 在这种情况下,我们可以进行如下引用:

file

然后在 dependencies 标签下引用Spring Boot 的starters 就行了。

Q3。Spring boot 中的starter是什么?

依赖管理对于项目至关重要。当项目足够复杂时,管理依赖项可能会变成一场噩梦,因为涉及的组件太多了。 这就是Spring Boot 的 starter 就派上用场了。每个starter都可以为我们提供所需要的Spring技术的一站式服务。并且以一致的方式传递和管理其他所需的依赖关系。 所有官方starter都在 org.springframework.boot 组下,其名称以 spring-boot-starter- 开头 。非官方的starter的名称在前,如 mybatis-spring-boot-starter。这种命名模式使得查找启动器变得很容易,尤其是在使用支持按名称搜索依赖关系的IDE时。但是这个不是绝对的,有些开发者可能不遵从这种契约。 目前大概有超过50种官方starter。最常用的是:

  • spring-boot-starter: 核心启动器,包括自动配置支持,日志记录和YAML
  • spring-boot-starter-aop: 使用Spring AOPAspectJ进行面向方面编程的初学者
  • spring-boot-starter-data-jpa: 使用Spring Data JPAHibernate的启动器
  • spring-boot-starter-jdbc: 用于将JDBCHikariCP连接池一起使用的启动器
  • spring-boot-starter-security: 使用Spring Security的启动器
  • spring-boot-starter-test: 用于测试Spring Boot应用程序的启动器
  • spring-boot-starter-web: 使用Spring MVC构建Web的启动器,包括RESTful应用程序

其他starter 可去spring.io查询

Q4。如何禁用特定的自动配置?

如果我们要禁用特定的自动配置,我们可以使用@EnableAutoConfiguration注解的exclude属性来指示它。如下禁用了数据源自动配置DataSourceAutoConfiguration

file

如果我们使用@SpringBootApplication注解。 它具有@EnableAutoConfiguration作为元注解 - 我们同样可以配置exclude属性来禁用自动配置:

file

我们还可以使用spring.autoconfigure.exclude环境属性禁用自动配置。在application.properties(也可以是application.yml)配置文件设置如下也可以达到同样的目的:

file

Q5。如何注册自定义自动配置?

要注册自动配置类,我们必须在META-INF / spring.factories文件的EnableAutoConfiguration 键(key)下列出其完全限定名称,如果是多个按照以下风格配置:

file

如果我们使用Maven构建一个项目,那么该文件应放在resources / META-INF目录中。

Q6。如何根据不同的条件来加载bean?

使用@Conditional 系列注解。 例如@ConditionalOnMissingBean。此注释的最显着属性是:

  • value:要检查的bean类型
  • name:要检查的bean的名称 放置在使用@Bean装饰的方法上时,目标类型默认为方法的返回类型:

file

表示的意思是如果不存在CustomService类型的bean则初始化并注入该bean。

Q7。如何将Spring Boot Web应用程序部署为JAR和WAR文件?

传统上,我们将Web应用程序打包为WAR文件,然后将其部署到外部服务器中。这样做可以让我们在同一台服务器上安排多个应用程序。在CPU和内存稀缺的时候,这是节省资源的好方法。 但事情发生了变化。现在计算机硬件相当便宜,并且注意力转向服务器配置。在部署期间配置服务器的一个小错误可能会导致灾难性后果。 Spring通过提供一个插件即spring-boot-maven-plugin来解决这个问题,将Web应用程序打包为可执行的JAR。要包含此插件,只需向pom.xml添加一个插件元素:

file

有了这个插件,我们将在执行包阶段后得到一个fat JAR 。此JAR包含所有必需的依赖项,包括嵌入式服务器。因此,我们不再需要担心配置外部服务器。 然后我们可以像运行普通的可执行JAR一样运行应用程序。 请注意,必须将pom.xml文件中的packaging元素设置为 jar 才能构建JAR文件:

file

如果我们不包含这个元素,它也默认为jar。 如果我们想要构建WAR文件,请将包装 元素更改为war

file

并将容器依赖关系从打包文件中删除:

file

执行Maven 包阶段后,我们将拥有一个可部署的WAR文件。

Q8。如何在Spring Boot启动的时候运行一些逻辑?

可以实现接口 ApplicationRunner 或者者 CommandLineRunner,这两个接口实现方式一样,它们都只提供了一个 run 方法。更加详细的操作参见我公众号:Felordcn 中的相关文章。

Q9。Spring boot支持哪些外部配置?

Spring Boot支持外部配置,允许我们在各种环境中运行相同的应用程序。我们可以使用properties文件,YAML文件,环境变量,系统属性和命令行选项参数来指定配置属性。 然后,我们可以访问使用这些属性@Value注释,经由绑定对象 的@ConfigurationProperties注释或Environment 环境抽象类注入。 以下是最常见的外部配置来源:

  • 命令行属性:命令行选项参数是以双连字符开头的程序参数,例如-server.port = 8080。Spring Boot将所有参数转换为属性,并将它们添加到环境属性集中。
  • 应用程序属性:应用程序属性是从application.properties文件或其YAML对应文件加载的属性。默认情况下,Spring Boot会在当前目录,类路径根或其config子目录中搜索此文件。 特定于配置文件的属性:特定于配置文件的属性从application- {profile} .properties文件或其YAML对应文件加载。{profile}占位符是指活性轮廓。这些文件与非特定属性文件位于相同位置,并且优先于非特定属性文件。

Q10。如何对Spring Boot应用进行测试?

在为Spring应用程序运行集成测试时,我们必须有一个ApplicationContext。 为了简化测试,Spring Boot为测试提供了一个特殊的注释 @SpringBootTest。此批注从其classes属性指示的配置类创建ApplicationContext。 如果未设置classes属性,Spring Boot将搜索主配置类。搜索从包含测试的包开始,直到找到使用@SpringBootApplication或@SpringBootConfiguration注释的类。 请注意,如果我们使用JUnit 4,我们必须用@RunWith(SpringRunner.class)装饰测试类。可以查阅 文章Spring Boot 2 实战:mock测试你的web应用

Q11 。 Spring Boot Actuator有什么用?

Spring Boot Actuator可以帮助你监控和管理Spring Boot应用,比如健康检查、审计、统计和HTTP追踪等。所有的这些特性可以通过JMX或者HTTP endpoints来获得。 Actuator同时还可以与外部应用监控系统整合,比如 Prometheus, Graphite, DataDog, Influx, Wavefront, New Relic等。这些系统提供了非常好的仪表盘、图标、分析和告警等功能,使得你可以通过统一的接口轻松的监控和管理你的应用。 Actuator使用Micrometer来整合上面提到的外部应用监控系统。这使得只要通过非常小的配置就可以集成任何应用监控系统。 将Spring Boot Actuator集成到一个项目中非常简单。我们需要做的就是在pom.xml文件中包含 spring-boot-starter-actuator启动器:

file

Spring Boot Actuator可以使用HTTPJMX端点公开操作信息。但是,大多数应用程序都使用HTTP,其中端点的标识和/执行器前缀形成URL路径。 以下是Actuator提供的一些最常见的内置端点:

  • auditevents: 公开审计事件信息
  • env: 公开环境属性
  • health: 显示应用程序运行状况信息
  • httptrace: 显示HTTP跟踪信息
  • info: 显示任意应用程序信息
  • metrics: 显示指标信息
  • mappings: 显示所有@RequestMapping路径的列表
  • scheduledtasks: 显示应用程序中的计划任务
  • threaddump: 执行线程转储
  • `beans :所有加载的spring bean

更多关于Spring Boot Actuator 的信息可查看Spring Boot 2.x 中的 Actuator请注意:生产使用Actuator务必保护好这些端点,避免未授权的访问请求

3.结论

今天小胖哥介绍了在技术面试中经常遇到的一些关于Spring Boot的最关键问题。掌握以上的知识在日常开发中也是必要的,希望对你的面试有所帮助。以上相关知识点在我个人博客都有详细的介绍。

关注公众号:Felordcn获取更多资讯

个人博客:https://felord.cn

© 著作权归作者所有

码农小胖哥

码农小胖哥

粉丝 54
博文 102
码字总数 118910
作品 1
郑州
程序员
私信 提问
年末干货!Java技术栈2017年度精选干货总结

Java技术栈2017年总结 2017年即将收尾了 这一年,满满的都是干货 这一年,我们的更新不曾停歇 这一年,你装逼内功应已有所成 我是小猿,下面是本年度的分享知识图谱 看完是不是有点蒙逼了?没...

架构之路
2017/12/24
0
0
免费分享Dubbo原理解析视频教程

Dubbo是目前最火热的分布式框架项目之一,Java程序员必熟悉之框架。 这是微信群友分享的Dubbo原理解析视频教程,真是Dubbo上手到精通干货。现在分享出来。 以下为教程预览截图。 获取上以视频...

架构之路
2017/12/28
0
1
吐血整理 20 道 Spring Boot 面试题,我经常拿来面试别人!

面试了一些人,简历上都说自己熟悉 Spring Boot, 或者说正在学习 Spring Boot,一问他们时,都只停留在简单的使用阶段,很多东西都不清楚,也让我对面试者大失所望。 下面,我给大家总结下有...

Java技术栈
2018/10/15
1K
1
springboot整合websocket实现一对一消息推送和广播消息推送

springboot基础环境 请参考springboot文档 maven依赖 代码准备 准备常量类 接收前端消息实体 后台发送消息实体 控制器 页面 测试 点击连接控制台输出 表示连接成功并且订阅了两个地址 此时在...

Java面经
07/18
54
0
Spring Boot 进阶,Spring Boot面试题高频出处

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/GitChat/article/details/95966523 上一篇带领大家初步了解了如何使用...

GitChat技术杂谈
07/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kafka实战(五) - 核心API及适用场景全面解析

1 四个核心API ● Producer API 允许一个应用程序发布一串流式的数据到一个或者多个Kafka topic。 ● Consumer API 允许一个应用程序订阅一个或多个topic ,并且对发布给他们的流式数据进行处...

JavaEdge
今天
11
0
实现线程的第三种方式——Callable & Future

Callable Runnable 封装一个异步运行的任务, 可以把它想象成为一个没有参数和返回值的异步方 法。Callable 与 Runnable 类似, 但是有返回值。Callable 接口是一个参数化的类型, 只有一 个...

ytuan996
今天
12
0
OSChina 周六乱弹 —— 不要摁F了!

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 : 朴树写的词曲都给人一种莫名的失落感,不过这首歌他自己却没有唱,换成赵传这种高音阶嘶喊的确很好,低沉但却有力,老男人的呐喊...

小小编辑
今天
22
0
Android Binder机制 - interface_cast和asBinder讲解

研究Android底层代码时,尤其是Binder跨进程通信时,经常会发现interface_cast和asBinder,很容易被这两个函数绕晕,下面来讲解一下: interface_cast 下面根据下述ICameraClient例子进行分析...

天王盖地虎626
昨天
13
0
计算机实现原理专题--存储器的实现(二)

计算机实现原理专题--存储器的实现(一)中描述了一种可以记住输入端变化的装置。现需要对其功能进行扩充,我们将上面的开关定义为置位,下面的开关定义为复位,然后需要增加一个保持位,当保...

FAT_mt
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部