Spring Boot 面试常见问题
在过去的几个月里,我收到了一些关于 Spring Boot 面试问题的咨询。在这篇文章中,我将介绍 21 个最常见的 Spring Boot 面试问题。此外,我还将讨论一些与微服务架构相关的问题。
我把这些 Spring Boot 面试题分为三类:针对新手、中级开发者和经验丰富的开发者。所以,如果你没有任何 Spring Boot 经验,新手题会对你有所帮助。
面向新手开发人员的 Spring Boot 面试问题
1. 什么是 Spring Boot 以及它在 Web 应用程序开发中有何用处?
Spring Boot 是一个基于 Spring 框架构建的框架,用于快速开发应用程序。同样,Ruby on Rails、Django 和 Python Web 框架也很有名。特别是,Spring 为 Java 带来了一个构建 Web 应用程序所需的 Web 框架。其嵌入式应用服务器和自动配置等重要功能可实现快速开发和部署。
- Spring Boot 框架允许轻松导入依赖项。
- 它还可以通过其丰富的功能简化在应用程序中使用 Spring Security。
- 执行器——可以实现可用于监控应用程序的生产就绪功能。
2.Spring Boot 和 Spring 有什么区别?
Spring 框架包含多个可在 Spring Boot 框架中使用的功能。另一方面,Spring Boot 框架用于应用程序开发。
同样,Spring 框架提供数据绑定、依赖注入、面向方面编程、数据访问、安全性等功能。
简而言之,Spring Boot 是 Spring 框架的一个模块。Spring Boot 构建于 Spring 框架之上。Spring Boot 是一个基于微服务的应用程序构建框架。Spring Boot 的自动配置功能有助于减少代码行数。
3.如何使用 maven 或 gradle 设置 Spring Boot 应用程序?
要设置 Spring Boot 应用程序,可以使用 Maven 或 Gradle。两者都用于拉取应用程序中所需的依赖项。特别是对于 Spring Boot 应用程序,可以拉取spring-boot-starter-parent
依赖项。
在 Maven 中,使用pom.xml
文件;在 Gradle 中,使用build.gradle
依赖声明
Maven:
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot</artifactId>
<version>2.4.1</version>
Gradle:
compile group: 'org.springframework.boot', name: 'spring-boot', version: '2.4.1'
4.如何更改Spring Boot应用程序的默认端口?
有三种方法可以更改 Spring Boot 应用程序的默认端口。其中,最直接的方法是使用application.properties
或application.yml
文件。
server.port
在 application.properties 中使用此属性。- 您还可以在主类中以编程方式更改端口
@SpringBootApplication
。 - 您可以在以 jar 文件形式启动应用程序时使用您选择的端口。
java -jar -Dserver.port=8980 myapplication.jar
5.如何使用 Spring Boot 设置带有 HTTPS 端口的应用程序?
默认情况下,Spring Boot 应用程序在 HTTP 端口上运行。要让你的应用程序使用 HTTPS 端口运行,有两种方法。
- 可以使用
server.port
、、和。server.ssl.key-store-password
server.ssl.key-store
server.ssl.key-store-type
server.ssl.key-alias
- 使用 HTTPS 端口的另一种方法是通过编程方式。
6.Spring Boot 支持哪些嵌入式服务器?
Spring Boot 应用程序支持 Tomcat、Jetty 和 Undertow Web 服务器。默认情况下,Spring Boot 的 Web Starter 支持 Tomcat Web 服务器。
要更改默认的 Web 服务器,必须排除spring-boot-starter-tomcat
并包含相应的服务器启动器,如 jetty 或 undertow。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
7.Spring Boot 有什么优点?
以下是 Spring Boot 的主要优点
- 允许创建独立的 Spring 应用程序
- 可以轻松使用 tomcat、jetty 或 undertow 服务器
- 快速发展
- 还可以轻松使用基于微服务的架构
针对中级开发人员的 Spring Boot 面试问题
到目前为止,我已经涵盖了一些基本的面试问题。如果你是一位拥有几年 Java 或 Spring Boot 开发经验的开发人员,下一组问题将帮助你找到需要改进的地方。
8.如何将 Spring Boot Web 应用程序部署为 jar 和 war 文件?
通常,我们将 Web 应用程序部署为 Web 存档文件(WAR)。我们将 War 文件部署到外部 Web 服务器上。
显然,如果使用 Maven 构建应用程序,Spring 会提供一个插件spring-boot-maven-plugin
。然后,您可以将 Web 应用程序打包为可执行 jar 文件。如果使用 Gradle,Gradle Build 会默认创建一个可执行 jar 文件。
对于 Maven,
<packaging>jar</packaging>
将构建一个 jar 文件。
<packaging>war</packaging>
将构建一个 war 文件。如果未包含 Packaging 元素,Maven 将默认构建 jar 文件。您还需要保留容器依赖关系,如下所示:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
对于 gradle,您需要将嵌入式容器的依赖项标记为属于 war 插件的providedRuntime
配置。
@SpringBootApplication
9.为什么我们在Spring Boot主应用程序类中使用注解?
对于要使用自动配置、组件扫描和额外配置的应用程序,可以包含一个注释@SpringBootApplication
。此注释包含三个注释@EnableAutoConfiguration
、@ComponentScan
和@Configuration
。
@EnableAutoConfiguration
– 启用 Spring Boot 的自动配置@ComponentScan
– 这允许扫描应用程序所在的包。@Configuration
– 允许在上下文中注册额外的 bean 或导入额外的配置类。
10. 注释有什么@RestController
用处@RequestMapping
?
@RestController
此注解添加了 @Controller 和 @ResponseBody 注解。此注解标记将处理传入请求的类。通常,此注解用于创建 RESTful API。
@RequestMapping
– 此注解在处理传入请求的类中提供路由信息。此注解将传入的 HTTP 请求映射到相应的方法。
11.为什么我们需要 Spring Profiles?
在构建企业应用程序时,我们会使用不同的环境,例如开发、测试、质量保证和生产。Spring Boot 允许针对每个环境配置不同的应用程序属性。
为了帮助分离每个环境的配置,可以根据环境命名属性文件,如application-dev.properties
、application-test.properties
和application-prod.properties
。
12.如何禁用特定的自动配置?
要禁用任何特定的自动配置,可以使用exclude
属性进行@EnableAutoConfiguration
注释。
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
public class SampleApplication
{
}
13.什么是Thymeleaf以及如何使用它?
Thymeleaf 是一个用于 Web 应用程序的服务器端模板引擎。它的主要目的是为 Web 应用程序提供自然的模板。
具体来说,必须spring-boot-starter-thymeleaf
在应用程序中包含依赖项才能使用 thymeleaf。
14. 有哪些不同的 Spring Boot 启动器?它们有何用途?
需要强调的是,Spring Boot 的一大优势在于它能够为你的 Spring Boot 应用程序提供各种依赖项。所有 Spring Boot 的启动依赖项都位于org.springframework.boot
组下。这些依赖项以 开头spring-boot-starter-
。
有超过 50 个启动依赖项,但下面列出了大多数开发人员将在其应用程序中使用的依赖项:
spring-boot-starter
核心启动器。包括自动配置、日志记录和 YAML。spring-boot-starter-data-jpa
– 这包括带有 Hibernate 的 Spring Data JPA。spring-boot-starter-security
Spring Security 模型为您的 Web 应用程序提供安全性。默认情况下,它将添加基于表单的基本身份验证。spring-boot-starter-web
– 这包括一个 Web 模块,并有助于使用 Spring MVC 创建 Web、RESTful 应用程序。spring-boot-starter-thymeleaf
– 导入此模块允许开发人员在应用程序中使用 thymeleaf 模板引擎。spring-boot-starter-jdbc
– 该模块有助于连接您的应用程序的数据库。spring-boot-starter-tomcat
通常,这是 Spring Boot 父模块的一部分。这允许开发人员使用嵌入式 Tomcat Servlet 容器。
针对经验丰富的开发人员的 Spring Boot 面试问题
下一组问题是针对经验丰富的开发人员的。尽管存在区别,但初学者和中级开发人员都应该了解这些问题。
15.如何使用 JPA 将 Spring Boot 应用程序连接到数据库?
Spring Boot 提供spring-boot-starter-data-jpa
依赖项以将 Spring 应用程序连接到关系数据库。
另一方面,Spring Data JPA 处理了基于 JDBC 的数据库访问和对象关系建模的复杂性。因此,它改进了数据访问层处理的实现。从开发人员的角度来看,它减少了对关系数据库查询的依赖。
JPA 允许将应用程序类映射到数据库表。
16.为什么要使用 Spring Boot Actuator?
Spring Boot Actuator为应用程序带来了可用于生产环境的功能。因此,用户可以轻松监控应用程序。
它还为应用程序提供审计、健康检查和不同的指标。因此,您可以按如下方式添加依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<scope>provided</scope>
</dependency>
以下是此依赖项为应用程序提供的一些端点:
- env – 显示所有环境属性的端点
- health – 显示应用程序健康状况的端点
- metrics – 此端点显示应用程序的各种指标
- loggers – 显示应用程序中记录器的配置
- httptrace – 显示 HTTP 跟踪信息的端点
17.Spring Boot Devtools 用于什么?
Spring Boot DevTools(或称开发者工具)是一套简化开发过程的工具。要包含 DevTools 支持,必须spring-boot-devtools
在项目中添加依赖项。
Spring Boot DevTools 有助于禁用许多 Spring Boot 依赖项使用的缓存。这在开发过程中非常有用,因为开发人员希望立即看到更改。
此外,使用此库允许应用程序在类路径上的文件发生变化时重新启动。
此外,该库还为 Web 组启用了调试日志记录。
18.使用 Spring Data JPA 有什么优势?
Spring Data Jpa 提供了 JpaTemplate 模板,用于将 Spring 应用程序与 JPA 集成。您还可以选择 JPA 规范的特定实现。默认情况下,它将是 Hibernate。
Spring Data JPA 的优势
- 减少样板代码
- 生成的查询有助于减少开发人员对数据库查询的依赖
- 存储库模式允许开发人员轻松处理持久性。
19.解释Spring Boot支持宽松绑定。
通常,属性的键需要与 Spring Boot 应用程序中的属性名称完全匹配。Spring Boot 支持宽松绑定,这意味着属性的键不必与属性名称完全匹配。
此外,环境属性可以以任何形式写入。例如,如果您propertyDB
的 Bean 类中有一个带有注解 的属性@ConfigurationProperties
,则可以将该属性绑定到以下任何环境属性:PROPERTYDB
、propertydb
或property_db
。
20.如果您想在应用程序中使用 Spring Security,您如何使用它,以及它如何确保应用程序的安全?
目前,为了保护您的 Spring Boot 应用程序,您可以spring-boot-starter-security
在项目中添加依赖项。默认情况下,它会为您的应用程序添加一些安全措施。这些默认措施包括向您的应用程序添加基于表单的基本身份验证或保护 REST API。
随后,为了利用 Spring Security,可以扩展WebSecurityConfigurerAdapter
类以添加自定义安全措施。在同一个类中,您将使用@EnableWebSecurity
注解。此注解允许 Spring 查找配置并将该类应用于全局 WebSecurity。
21.注释用来做什么@ControllerAdvice
?
@ControllerAdvice
注解有助于管理 Spring Boot 应用程序中的异常。简而言之,它是一个拦截器,用于拦截使用 @RequestMapping 注解的方法引发的异常。
ResponseEntityExceptionHandler
是提供集中异常处理的基类。
到目前为止,我已经涵盖了 Spring Boot 面试题。我还会介绍一些对开发人员有帮助的微服务面试题。
微服务面试题
1.什么是微服务?
微服务是一种架构风格。它将应用程序构建为一系列服务,这些服务
- 高度可维护
- 松散耦合
- 易于部署
- 由一个小团队拥有
2. 构建和部署微服务的常用工具有哪些?
这取决于技术栈。DockerDocker
仍然是一个通用工具,与技术栈无关。因此,Docker 允许为微服务创建容器。然后,该容器可以部署在云环境中。
Wiremock
是另一个用于微服务灵活 API 模拟的工具。
Hysterix
是一种有助于降低应用程序延迟和容错能力的断路器。
3. Spring 如何帮助微服务开发?
最重要的是,Spring 有助于快速开发。Spring Boot 有助于构建 REST API 和 Web 应用程序。Spring Cloud 有助于与外部系统集成。
4.微服务面临哪些挑战?
微服务相互依赖。因此,这些服务之间的通信需要得到保护。由于微服务是一个分布式系统,它可能会成为一个复杂的模型。这可能会带来运营开销。服务越多,资源消耗也就越大。
结论
在这篇文章中,我涵盖了你在面试中可能遇到的大多数关于 Spring Boot 的问题。希望这篇文章对你有所帮助。
鏂囩珷鏉ユ簮锛�https://dev.to/betterjavacode/top-21-spring-boot-interview-questions-1705