以下面试题,基于网络整理,和自己编辑。具体参考的文章,会在文末给出所有的链接。
如果胖友有自己的疑问,欢迎在星球提问,我们一起整理吊吊的 Spring Boot 面试题的概览。
而题目的难度,艿艿尽量按照从容易到困难的顺序,逐步下去。
在内容上,我们会分成两大块:
- 核心技术篇,分享 Spring Boot 的核心技术相关的内容。
- 整合篇,分享 Spring Boot 整合一些框架的面试题,例如 JPA 如何集成到 Spring Boot 中。
核心技术篇
Spring Boot 是什么?
Spring Boot 是 Spring 的子项目,正如其名字,提供 Spring 的引导( Boot )的功能。
通过 Spring Boot ,我们开发者可以快速配置 Spring 项目,引入各种 Spring MVC、Spring Transaction、Spring AOP、MyBatis 等等框架,而无需不断重复编写繁重的 Spring 配置,降低了 Spring 的使用成本。
艿艿:犹记当年,Spring XML 为主的时代,大晚上各种搜索 Spring 的配置,苦不堪言。现在有了 Spring Boot 之后,生活真美好。
Spring Boot 提供了各种 Starter 启动器,提供标准化的默认配置。例如:
-
spring-boot-starter-web
启动器,可以快速配置 Spring MVC 。 -
mybatis-spring-boot-starter
启动器,可以快速配置 MyBatis 。
并且,Spring Boot 基本已经一统 Java 项目的开发,大量的开源项目都实现了其的 Starter 启动器。例如:
-
incubator-dubbo-spring-boot-project
启动器,可以快速配置 Dubbo 。 -
rocketmq-spring-boot-starter
启动器,可以快速配置 RocketMQ 。
Spring Boot 提供了哪些核心功能?
-
1、独立运行 Spring 项目
Spring Boot 可以以 jar 包形式独立运行,运行一个 Spring Boot 项目只需要通过
java -jar xx.jar
来运行。
-
2、内嵌 Servlet 容器
Spring Boot 可以选择内嵌 Tomcat、Jetty 或者 Undertow,这样我们无须以 war 包形式部署项目。
第 2 点是对第 1 点的补充,在 Spring Boot 未出来的时候,大多数 Web 项目,是打包成 war 包,部署到 Tomcat、Jetty 等容器。
-
3、提供 Starter 简化 Maven 配置
Spring 提供了一系列的 starter pom 来简化 Maven 的依赖加载。例如,当你使用了
spring-boot-starter-web
,会自动加入如下依赖: -
Spring Boot 检测到特定类的存在,就会针对这个应用做一定的配置,进行自动配置 Bean ,这样会极大地减少我们要使用的配置。
当然,Spring Boot 只考虑大多数的开发场景,并不是所有的场景,若在实际开发中我们需要配置Bean ,而 Spring Boot 没有提供支持,则可以自定义自动配置进行解决。
-
5、准生产的应用监控
Spring Boot 提供基于 HTTP、JMX、SSH 对运行时的项目进行监控。
-
6、无代码生成和 XML 配置
Spring Boot 没有引入任何形式的代码生成,它是使用的 Spring 4.0 的条件
@Condition
注解以实现根据条件进行配置。同时使用了 Maven /Gradle 的依赖传递解析机制来实现 Spring 应用里面的自动配置。第 6 点是第 3 点的补充。
Spring Boot 有什么优缺点?
艿艿:任何技术栈,有优点必有缺点,没有银弹。
另外,这个问题的回答,我们是基于 《Spring Boot浅谈(是什么/能干什么/优点和不足)》 整理,所以胖友主要看下这篇文章。
Spring Boot 的优点
艿艿:优点和 「Spring Boot 提供了哪些核心功能?」 问题的答案,是比较重叠的。
- 1、使【编码】变简单。
- 2、使【配置】变简单。
- 3、使【部署】变简单。
- 4、使【监控】变简单。
Spring Boot 的缺点
艿艿:如下的缺点,基于 《Spring Boot浅谈(是什么/能干什么/优点和不足)》,考虑的出发点是把 Spring Boot 作为微服务的框架的选型的角度进行考虑。
-
1、没有提供相应的【服务发现和注册】的配套功能。
艿艿:当然,实际上 Spring Boot 本身是不需要提供这样的功能。服务发现和注册的功能,是在 Spring Cloud 中进行提供。
-
2、自身的 acturator 所提供的【监控功能】,也需要与现有的监控对接。
-
3、没有配套的【安全管控】方案。
艿艿:关于这一点,艿艿也有点迷糊,Spring Security 是可以比较方便的集成到 Spring Boot 中,所以不晓得这里的【安全管控】的定义是什么。所以这一点,面试的时候回答,可以暂时先省略。
-
4、对于 REST 的落地,还需要自行结合实际进行 URI 的规范化工作
艿艿:这个严格来说,不算缺点。本身,是规范的范畴。
所以,上面的缺点,严格来说可能不太适合在面试中回答。艿艿认为,Spring Boot 的缺点主要是,因为自动配置 Spring Bean 的功能,我们可能无法知道,哪些 Bean 被进行创建了。这个时候,如果我们想要自定义一些 Bean ,可能存在冲突,或者不知道实际注入的情况。
Spring Boot、Spring MVC 和 Spring 有什么区别?
Spring 的完整名字,应该是 Spring Framework 。它提供了多个模块,Spring IoC、Spring AOP、Spring MVC 等等。所以,Spring MVC 是 Spring Framework 众多模块中的一个。
而 Spring Boot 是构造在 Spring Framework 之上的 Boot 启动器,旨在更容易的配置一个 Spring 项目。
总结说来,如下图所示:
Spring Boot 中的 Starter 是什么?
比较通俗的说法:
FROM 《Spring Boot 中 Starter 是什么》
比如我们要在 Spring Boot 中引入 Web MVC 的支持时,我们通常会引入这个模块
spring-boot-starter-web
,而这个模块如果解压包出来会发现里面什么都没有,只定义了一些 POM 依赖。如下图所示:经过研究,Starter 主要用来简化依赖用的。比如我们之前做MVC时要引入日志组件,那么需要去找到log4j的版本,然后引入,现在有了Starter之后,直接用这个之后,log4j就自动引入了,也不用关心版本这些问题。
比较书名的说法:
依赖管理是任何复杂项目的关键部分。以手动的方式来实现依赖管理不太现实,你得花更多时间,同时你在项目的其他重要方面能付出的时间就会变得越少。
Spring Boot Starter 就是为了解决这个问题而诞生的。Starter POM 是一组方便的依赖描述符,您可以将其包含在应用程序中。您可以获得所需的所有 Spring 和相关技术的一站式服务,无需通过示例代码搜索和复制粘贴依赖。
Spring Boot 常用的 Starter 有哪些?
-
spring-boot-starter-web
:提供 Spring MVC + 内嵌的 Tomcat 。 -
spring-boot-starter-data-jpa
:提供 Spring JPA + Hibernate 。 -
spring-boot-starter-data-redis
:提供 Redis 。 -
mybatis-spring-boot-starter
:提供 MyBatis 。
创建一个 Spring Boot Project 的最简单的方法是什么?
Spring Initializr 是创建 Spring Boot Projects 的一个很好的工具。打开 "https://start.spring.io/"
网站,我们可以看到 Spring Initializr 工具,如下图所示:
- 图中的每一个红线,都可以填写相应的配置。相信胖友都很熟悉,就不哔哔了。
- 点击生 GenerateProject ,生成 Spring Boot Project 。
- 将项目导入 IDEA ,记得选择现有的 Maven 项目。
当然,我们以前使用 IDEA 创建 Spring 项目的方式,也一样能创建 Spring Boot Project 。Spring Initializr 更多的是,提供一个便捷的工具。
如何统一引入 Spring Boot 版本?
目前有两种方式。
① 方式一:继承 spring-boot-starter-parent
项目。配置代码如下:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.1.RELEASE</version> </parent> |
② 方式二:导入 spring-boot-dependencies 项目依赖。配置代码如下:
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.5.1.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> |
如何选择?
因为一般我们的项目中,都有项目自己的 Maven parent 项目,所以【方式一】显然会存在冲突。所以实际场景下,推荐使用【方式二】。
详细的,推荐阅读 《Spring Boot 不使用默认的 parent,改用自己的项目的 parent》 文章。
另外,在使用 Spring Cloud 的时候,也可以使用这样的方式。
运行 Spring Boot 有哪几种方式?
- 1、打包成 Fat Jar ,直接使用
java -jar
运行。目前主流的做法,推荐。 - 2、在 IDEA 或 Eclipse 中,直接运行应用的 Spring Boot 启动类的
#main(String[] args)
启动。适用于开发调试场景。 - 3、如果是 Web 项目,可以打包成 War 包,使用外部 Tomcat 或 Jetty 等容器。
如何打包 Spring Boot 项目?
通过引入 spring-boot-maven-plugin
插件,执行 mvn clean package
命令,将 Spring Boot 项目打成一个 Fat Jar 。后续,我们就可以直接使用 java -jar
运行。
关于 spring-boot-maven-plugin
插件,更多详细的可以看看 《创建可执行 jar》 。
如果更改内嵌 Tomcat 的端口?
-
方式一,修改
application.properties
配置文件的server.port
属性。server.port=9090
-
方式二,通过启动命令增加
server.port
参数进行修改。java -jar xxx.jar --server.port=9090
当然,以上的方式,不仅仅适用于 Tomcat ,也适用于 Jetty、Undertow 等服务器。
如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?
一共有三种方式,可以实现效果:
- 【推荐】
spring-boot-devtools
插件。注意,这个工具需要配置 IDEA 的自动编译。 -
Spring Loaded 插件。
Spring Boot 2.X 后,官方宣布不再支持 Spring Loaded 插件 的更新,所以基本可以无视它了。
-
JRebel 插件,需要付费。
关于如何使用 spring-boot-devtools
和 Spring Loaded 插件,胖友可以看看 《Spring Boot 学习笔记:Spring Boot Developer Tools 与热部署》 。
Spring Boot 的配置文件有哪几种格式?
Spring Boot 目前支持两种格式的配置文件:
-
.properties
格式。示例如下:server.port = 9090
-
.yaml
格式。示例如下:server: port: 9090
可能有胖友不了解 YAML 格式?
YAML 是一种人类可读的数据序列化语言,它通常用于配置文件。
- 与 Properties 文件相比,如果我们想要在配置文件中添加复杂的属性 YAML 文件就更加结构化。从上面的示例,我们可以看出 YAML 具有分层配置数据。
- 当然 YAML 在 Spring 会存在一个缺陷,
@PropertySource
注解不支持读取 YAML 配置文件,仅支持 Properties 配置文件。- 不过这个问题也不大,可以麻烦一点使用
@Value
注解,来读取 YAML 配置项。
- 不过这个问题也不大,可以麻烦一点使用
实际场景下,艿艿相对比较喜欢使用 Properties 配置文件。个人喜欢~当然,YAML 已经越来越流行了。
Spring Boot 默认配置文件是什么?
对于 Spring Boot 应用,默认的配置文件根目录下的 application 配置文件,当然可以是 Properties 格式,也可以是 YAML 格式。
可能有胖友说,我在网上看到面试题中,说还有一个根目录下的 bootstrap 配置文件。这个是 Spring Cloud 新增的启动配置文件,需要引入 spring-cloud-context
依赖后,才会进行加载。它的特点和用途主要是:
参考 《Spring Cloud 中配置文件名 bootstrap.yml 和 application.yml 区别》 文章。
- 【特点】因为 bootstrap 由父 ApplicationContext 加载,比 application 优先加载。
- 【特点】因为 bootstrap 优先于 application 加载,所以不会被它覆盖。
- 【用途】使用配置中心 Spring Cloud Config 时,需要在 bootstrap 中配置配置中心的地址,从而实现父 ApplicationContext 加载时,从配置中心拉取相应的配置到应用中。
另外,《Appendix A. Common application properties》 中,有 application 配置文件的通用属性列表。
Spring Boot 如何定义多套不同环境配置?
可以参考 《Spring Boot 教程 - Spring Boot Profiles 实现多环境下配置切换》 一文。
但是,需要考虑一个问题,生产环境的配置文件的安全性,显然我们不能且不应该把生产的配置放到项目的 Git 仓库中进行管理。那么应该怎么办呢?
- 方案一,生产环境的配置文件放在生产环境的服务器中,以
java -jar myproject.jar --spring.config.location=/xxx/yyy/application-prod.properties
命令,设置 参数spring.config.location
指向配置文件。 - 方案二,使用 Jenkins 在执行打包,配置上 Maven Profile 功能,使用服务器上的配置文件。
发表评论
相关推荐
Spring Boot 是一种基于 Java 的框架,旨在简化Spring框架的初始设置和常规配置。Spring Boot的出现是为了应对Spring项目日益复杂的构建和配置问题。在传统的Spring项目中,开发者需要手动添加构建路径、Maven依赖...
标题中提到的“Spring Boot面试题(92题).pdf”表明这是一份包含了92个关于Spring Boot的面试题目的文档。Spring Boot是Spring的一个重要项目,它通过约定优于配置的理念,简化了基于Spring的应用开发,被广泛应用...
Spring Boot 面试题 问题一:什么是 Spring Boot? Spring Boot 是解决 Spring 框架复杂度问题的方法。随着新功能的增加,Spring 变得越来越复杂。 Spring Boot 已经建立在现有 Spring 框架之上,使用 Spring 启动...
Spring Boot是由Pivotal团队提供的全新框架,其设计目标是简化新Spring应用的初始搭建以及开发过程。Spring Boot采用自动化配置的方式,减少了开发者编写配置的工作量。 #### 2. 自动配置原理 Spring Boot自动配置...
### Spring Boot 面试题解析 #### 1. 什么是Spring Boot? Spring Boot 是一款由 Pivotal 团队提供的全新框架,旨在简化新Spring应用的初始搭建以及开发过程。传统的Spring应用需要进行大量的XML配置,这不仅繁琐...
Spring Boot和Spring Cloud是现代Java开发中的两个关键框架,它们在构建微服务架构中起着至关重要的作用。Spring Boot作为Spring框架的一个子项目,旨在简化应用程序的创建和配置过程,而Spring Cloud则提供了全面的...
Spring Boot 论坛式面试题系列 本资源为 Spring Boot 面试题系列,涵盖了 Spring Boot 的基础知识、优点、核心功能、配置、自动配置、监控、项目创建等方面。 标题:"架构师面试题系列之 Spring Boot 面试专题及...
Spring Boot 面试题知识点总结 本文总结了 Spring Boot 面试题中的知识点,涵盖了概述、配置、安全、监视器、整合第三方项目和其他几个方面。 概述 Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站...
Spring Boot 面试题详解 在 Java 开发领域,Spring Boot 是一个非常流行的框架,它提供了简洁的配置方式和自动化配置功能,简化了开发者的工作。然而,在面试中,很多开发者对 Spring Boot 的理解仅停留在简单的...
### Spring Boot 面试题详解 #### 1. 什么是Spring Boot? Spring Boot是由Pivotal团队提供的全新框架,旨在简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式(默认配置)来简化Spring应用的整个...
41 道 Spring Boot 面试题
20道顶尖的Spring Boot面试题!
Spring Boot 是一个由 Pivotal 公司主导的开源项目,它是基于 Spring Framework 的一个扩展,旨在简化 Spring 应用程序的初始搭建以及...在面试中,理解这些核心概念和优势将有助于展示你对 Spring Boot 的深入掌握。
Spring Cloud 面试题及答案 以下是对 Spring Cloud 相关知识点的详细解释: 1. 什么是 Spring Cloud? Spring Cloud 是一系列框架的有序集合,利用 Spring Boot 的开发便利性巧妙地简化了分布式系统基础设施的...
41 道 Spring Boot 面试题,帮你整理好了
这份名为"Spring、Mybatis、Springboot常用面试试题及答案.rar"的压缩包文件,显然是为准备面试的Java工程师提供了一份宝贵的资源。下面,我们将详细探讨这些框架的核心知识点和常见面试问题。 1. **Spring框架**:...
### Spring Boot面试题详解 #### 一、Spring Boot 基础 **1.1 什么是Spring Boot?** Spring Boot 是 Spring 社区推出的一个基于 Spring 框架的全新子项目,旨在简化 Spring 应用程序的创建过程。通过采用特定的...
在面试中,可能会遇到的Spring Boot相关问题包括: 1. 为什么选择Spring Boot?其优点包括独立运行、简化配置、自动配置、无需代码生成和XML配置,以及应用监控等功能。 2. Spring Boot的核心注解是@SpringBoot...
Spring Cloud 是一套完整的微服务解决方案,它基于 Spring Boot 进行快速开发,为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能...这些内容对于理解和应对 Spring Cloud 相关的面试题是非常关键的。