共计 4618 个字符,预计需要花费 12 分钟才能阅读完成。
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
元素:
我们可以在 Maven 中央仓库找到最新版本的 spring-boot-starter-parent
。
上面的方式很方便但是并不一定符合实际需要。例如公司要求所有项目依赖构建从一个标准 BOM 开始,我们就不能按上面的方式进行。
在这种情况下,我们可以进行如下引用:
然后在 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
:核心启动器,包括自动配置支持,日志记录和 YAMLspring-boot-starter-aop
:使用Spring AOP
和AspectJ
进行面向方面编程的初学者spring-boot-starter-data-jpa
:使用Spring Data JPA
和Hibernate
的启动器spring-boot-starter-jdbc
:用于将JDBC
与HikariCP
连接池一起使用的启动器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
:
如果我们使用 @SpringBootApplication
注解。它具有 @EnableAutoConfiguration
作为元注解 – 我们同样可以配置 exclude 属性来禁用自动配置:
我们还可以使用 spring.autoconfigure.exclude
环境属性禁用自动配置。在 application.properties
(也可以是application.yml
) 配置文件设置如下也可以达到同样的目的:
Q5。如何注册自定义自动配置?
要注册自动配置类,我们必须在 META-INF / spring.factories
文件的 EnableAutoConfiguration
键(key)下列出其完全限定名称,如果是多个按照以下风格配置:
如果我们使用 Maven 构建一个项目,那么该文件应放在 resources / META-INF
目录中。
Q6。如何根据不同的条件来加载 bean?
使用 @Conditional
系列注解。例如@ConditionalOnMissingBean
。此注释的最显着属性是:
value
:要检查的 bean 类型name
:要检查的 bean 的名称
放置在使用 @Bean
装饰的方法上时,目标类型默认为方法的返回类型:
表示的意思是如果不存在 CustomService
类型的 bean 则初始化并注入该 bean。
Q7。如何将 Spring Boot Web 应用程序部署为 JAR 和 WAR 文件?
传统上,我们将 Web 应用程序打包为 WAR 文件,然后将其部署到外部服务器中。这样做可以让我们在同一台服务器上安排多个应用程序。在 CPU 和内存稀缺的时候,这是节省资源的好方法。
但事情发生了变化。现在计算机硬件相当便宜,并且注意力转向服务器配置。在部署期间配置服务器的一个小错误可能会导致灾难性后果。
Spring 通过提供一个插件即 spring-boot-maven-plugin
来解决这个问题,将 Web 应用程序打包为可执行的 JAR
。要包含此插件,只需向pom.xml
添加一个插件元素:
有了这个插件,我们将在执行包阶段后得到一个 fat JAR
。此 JAR 包含所有必需的依赖项,包括嵌入式服务器。因此,我们不再需要担心配置外部服务器。
然后我们可以像运行普通的可执行 JAR
一样运行应用程序。
请注意,必须将 pom.xml
文件中的 packaging
元素设置为 jar
才能构建 JAR
文件:
如果我们不包含这个元素,它也默认为 jar
。
如果我们想要构建 WAR
文件,请将包装 元素更改为war
:
并将容器依赖关系从打包文件中删除:
执行 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
启动器:
Spring Boot Actuator
可以使用 HTTP
或JMX
端点公开操作信息。但是,大多数应用程序都使用 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