欢迎来到我们详尽的Spring Boot面试问题指南!Spring Boot 在 Java 生态系统中越来越受欢迎,因为它易于使用,并且提高了开发 Java 应用程序的生产力。这篇文章将向你展示一组精心策划的经常被问到的Spring Boot面试问题,以帮助你在面试中取得好成绩,无论你是发现Spring Boot的新手,还是准备面试的有经验的开发人员。
Spring Boot 是一个建立在 Spring 框架之上的开源 Java 框架。Spring Boot 旨在以最少的设置和配置更轻松地创建独立的、生产就绪的应用程序。
Spring Boot 为 Java 应用程序开发提供了几个显著的优势。一些主要优势包括:
Spring Boot 包含多个关键组件,这些组件协同工作以提供简化且高效的开发体验。Spring Boot 的主要组件包括:
以下是 Spring 和 Spring Boot 之间的比较:
特征 | 春天 | SPRING 启动 |
---|---|---|
配置 | 需要手动配置 | 提供自动配置和合理的默认值 |
依赖关系管理 | 手动依赖项管理 | 使用启动器简化依赖关系管理 |
XML 配置 | 严重依赖 XML 配置 | 鼓励使用注解和 Java 配置 |
嵌入式服务器 | 需要手动设置和配置 | 包括嵌入式服务器,便于部署 |
自动配置 | 自动配置功能有限 | 强大的自动配置功能,可实现快速开发 |
开发时间 | 更长的开发设置和配置 | 使用开箱即用的默认值加快开发速度 |
约定优先于配置 | 强调配置 | 强调约定而不是配置 |
微服务支持 | 支持微服务架构 | 提供与 Spring Cloud 的无缝集成 |
测试支持 | Spring Test 提供强大的测试支持 | 使用 Spring Boot Test 增强了测试支持 |
驱动器 | 执行器可作为单独的模块提供 | 执行器集成到核心框架中 |
需要注意的是,Spring 和 Spring Boot 并不相互排斥。Spring Boot 建立在 Spring 框架之上,并提供了额外的功能来简化和加速 Spring 应用程序开发。
@SpringBootApplication注释结合了其他三种常用注释:@Configuration、@EnableAutoConfiguration 和 @ComponentScan。这种单一注释允许对应用程序进行简洁和简化的配置。
@SpringBootApplication注解通常放置在 Spring Boot 应用程序的主类上。它充当应用程序的入口点,并引导Spring Boot运行时环境。
Spring Boot 启动器是预配置依赖项的精选集合,可简化 Spring Boot 应用程序中特定功能的设置和配置。它们提供必要的依赖项、合理的默认配置和自动配置。
例如,spring-boot-starter-web starter 包含对 Web 相关库的依赖项,并提供用于处理 Web 请求的默认配置。Starters 简化了依赖关系管理,并确保所需的组件无缝协作。
通过在项目中加入入门程序,您可以避免手动配置,从而节省时间和精力,并获得 Spring Boot 固执己见的应用程序开发方法的好处。
以下是一些常用的 Spring Boot 启动器示例:
Spring Boot 启动器的完整列表可以在 Spring Boot 官方网站上找到。这是官方 Spring Boot Starters 文档的链接:Spring Boot Starters。
Spring Boot 使用的默认嵌入式服务器是 Apache Tomcat。Spring Boot 将 Tomcat 作为依赖项包含在内,并在使用 spring-boot-starter-web starter 或任何其他与 Web 相关的启动器时自动将其配置为默认嵌入式服务器。
在 Spring Boot 应用程序中,可以使用各种方法配置属性。以下是常用的方法:
Spring Boot 自动配置会根据类路径依赖关系自动配置应用程序上下文,从而减少手动配置的需要。它扫描类路径以查找所需的库,并设置必要的 Bean 和组件。自动配置遵循预定义的规则,并使用 @ConditionalOnClass 和 @ConditionalOnMissingBean 等注释有选择地启用配置。通过将@EnableAutoConfiguration注解添加到主应用程序类,Spring Boot 会触发自动配置过程。自动配置类通常打包在启动器中,其中包含必要的配置类和依赖项。在项目中包含启动器使 Spring Boot 能够自动配置相关组件。
Spring Boot 自动配置的好处包括:
使用 Spring Initializr 可以轻松创建 Spring Boot 应用程序。Spring Initializr 是一个基于 Web 的工具,用于生成一个项目模板,其中包含 Spring Boot 应用程序的所有必要依赖项和配置。
要使用 Spring Initializr 轻松创建 Spring Boot 应用程序,您可以按照下列步骤操作:
Spring Boot 执行器是 Spring Boot 框架提供的一组生产就绪管理和监视工具。它们使您能够在运行时监视 Spring Boot 应用程序并与之交互,从而提供有关其运行状况、指标和其他各个方面的宝贵见解。
执行器公开一组 RESTful 端点,允许您访问有用的信息并在 Spring Boot 应用程序上执行某些操作。一些常用的终结点包括:
Spring Boot 配置文件提供了一种管理不同环境或部署方案的应用程序配置的方法。使用配置文件,您可以为开发、测试、生产和任何其他特定环境定义不同的配置集。
以下是 Spring Boot 配置文件的工作原理以及如何使用它们的简要说明:
以下是一些常用的 Spring Boot 注解:
Spring Boot 中的@ConfigurationProperties注用于将外部配置属性绑定到 Java 类。它提供了一种将配置文件(如 application.properties 或 application.yml)中定义的属性映射到配置类中的相应字段的便捷方法。
使用@ConfigurationProperties的好处包括:
下面是一个使用示例:@ConfigurationProperties
@Configuration
@ConfigurationProperties(prefix = "myapp")
public class MyAppConfiguration {
private String name;
private int port;
// Getters and setters
// Other custom methods or business logic
}
# Database Configuration
spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase
spring.datasource.username=myusername
spring.datasource.password=mypassword
# Server Configuration
server.port=8080
server.servlet.context-path=/myapp
# Custom Application Properties
myapp.name=My Application
myapp.api.key=abc123
在此示例中,MyAppConfiguration 类使用 @ConfigurationProperties 进行批注,并指定前缀“myapp”。配置文件中以前缀“myapp”定义的属性将绑定到此类中的相应字段。
Spring Boot 为构建基于微服务的应用程序提供了广泛的支持。它提供了一系列功能和集成,可简化微服务的开发、部署和管理。以下是 Spring Boot 支持微服务架构的方式:
Spring Data 是 Spring Framework 的一个子项目,它通过为不同的数据存储技术提供统一的编程模型来简化数据访问。它减少了样板代码,并允许开发人员专注于业务逻辑。Spring Data 支持关系数据库、NoSQL 数据库等。它利用存储库来抽象数据访问操作,无需手动 CRUD 代码。Spring Data的启动器为特定数据库提供预配置的依赖项和自动配置,从而简化了设置过程。借助 Spring Data,开发人员可以轻松地与数据源进行交互,并从其强大的查询功能中受益。
以下是适用于不同类型数据库的 Spring Data 启动器的一些示例:
在 Spring Boot 应用程序中,您可以使用 RestTemplate 或 WebClient 使用 RESTful Web 服务。RestTemplate 提供了用于发出 HTTP 请求的同步 API,而 WebClient 提供了一种非阻塞和反应式方法。两者都允许您发送 GET、POST、PUT、DELETE 请求、处理响应数据并将其反序列化为 Java 对象。
在 Spring Boot 应用程序中,您可以使用 Spring Test 框架创建和运行单元测试。通过利用 @RunWith(SpringRunner.class) 和 @SpringBootTest 等注释,您可以初始化应用程序上下文并对 Bean 和组件执行测试。
此外,您可以使用 Mockito 或其他模拟框架来模拟依赖项并隔离被测单元。借助 JUnit 或 AssertJ 的断言,可以验证预期的行为和断言。
最后,可以使用 Maven 或 Gradle 等工具运行测试,这些工具执行测试并提供有关测试结果和覆盖率的报告。
若要在 Spring Boot 应用程序中启用调试日志,可以将 application.properties 或 application.yml 文件中的 logging.level 属性设置为“DEBUG”。此配置将使日志记录框架能够输出详细的调试信息。或者,您可以对类使用@Slf4j注释来启用该特定类的日志记录。此外,还可以通过设置 logging.level 来配置特定包或类的日志记录级别。{package/class} 属性。
若要为整个应用程序启用调试日志,请使用:
logging.level.=DEBUG
若要为整个应用程序启用调试日志,请使用:
logging.level.root=DEBUG
Spring Boot 通过与 Spring WebFlux 模块的集成来支持响应式编程。它允许开发人员构建非阻塞、事件驱动的应用程序,这些应用程序可以有效地处理大量并发请求,利用反应式流和反应式编程模型。
我们可以使用以下不同的选项。
它旨在提高生产力,简化开发工作流程,并在开发阶段实现应用程序快速重启。
以下是 Spring Boot DevTools 的一些主要功能和优势:
若要在 Spring Boot 应用程序中启用 Spring Boot DevTools,需要包含相应的依赖项和配置。下面是启用 DevTools 的步骤:
添加 DevTools 依赖项:在 pom.xml 文件(适用于 Maven)或 build.gradle 文件(适用于 Gradle)中,添加以下依赖项:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<scope>runtimescope>
<optional>trueoptional>
dependency>
// Gradle
implementation 'org.springframework.boot:spring-boot-devtools'
启用自动重启:默认情况下,为使用 spring-boot:run 命令或从 IDE 运行的应用程序启用 DevTools。但是,您也可以通过将以下配置属性添加到 application.properties 或 application.ymlfile 中来为打包的应用程序启用它:
spring.devtools.restart.enabled=true
若要在 Spring Boot 应用程序中启用 HTTPS,需要配置应用程序的服务器属性并提供必要的 SSL/TLS 证书。以下是启用 HTTPS 的一般步骤:
server.port=8443
server.ssl.key-store-type=PKCS12
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=your_keystore_password
server.ssl.key-alias=your_alias_name
在上面的示例中,替换为密钥库文件的路径,并设置适当的密码和别名值。keystore.p12
若要在 Spring Boot 中配置项目外部的外部配置,可以使用以下方法之一:
若要使用 Maven 创建 Spring Boot 应用程序,请按照下列步骤操作:
设置 Maven:确保系统上安装了 Maven。您可以从 Apache Maven 网站下载 Maven 并按照安装说明进行操作。
创建 Maven 项目:打开命令行或终端,然后导航到要创建项目的目录。使用以下 Maven 命令创建新项目:
mvn archetype:generate -DgroupId=com.example -DartifactId=my-spring-boot-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
此命令使用指定的 groupId 和 artifactId 创建新的 Maven 项目。根据项目需求调整这些值。
添加 Spring Boot Starter 依赖项:打开项目的pom.xml文件,并为 Spring Boot 添加以下依赖项:
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
<version>2.5.2version>
dependency>
dependencies>
此依赖项包括应用程序所需的 Spring Boot 库。
创建 Spring Boot 主类:在 Maven 项目的相应包中创建一个新的 Java 类。此类将用作 Spring Boot 应用程序的入口点。下面是一个示例:
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MySpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class, args);
}
}
该@SpringBootApplication注解结合了基本 Spring Boot 应用程序所需的多个注解。
生成并运行应用程序:使用以下 Maven 命令生成并运行 Spring Boot 应用程序:
mvn spring-boot:run
Maven 将构建您的项目,解析依赖项,并启动 Spring Boot 应用程序。
应用程序运行后,您可以使用http://localhost:8080(默认情况下)或指定的端口(如果您已自定义)在 Web 浏览器中访问它。
就是这样!您已使用 Maven 创建了 Spring Boot 应用程序。现在,您可以添加其他依赖项、配置应用程序并开发所需的功能。
Spring Boot 中一些常用的条件注解是:
运行状况检查提供有关应用程序整体运行状况的宝贵信息,例如数据库连接、外部服务可用性或您定义的任何其他自定义检查。
默认情况下,Spring Boot Actuator 提供一组预定义的运行状况指示器,用于检查各种组件(如数据库、磁盘空间等)的运行状况。但是,您也可以创建自定义运行状况指示器来监视应用程序的特定方面。
要创建自定义运行状况指示器,您需要实现 HealthIndicator 接口并覆盖 health() 方法。health() 方法应返回一个 Health 实例,该实例表示自定义组件的运行状况。可以使用 Health 类来指示组件是启动、关闭还是处于未知状态。
下面是自定义运行状况指示器的示例:
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;
@Component
public class CustomHealthIndicator implements HealthIndicator {
@Override
public Health health() {
// 在此处执行自定义运行状况检查逻辑
boolean isHealthy = true; // 替换为实际运行状况检查逻辑
if (isHealthy) {
return Health.up().build();
} else {
return Health.down().withDetail("CustomComponent", "Not Healthy").build();
}
}
}
在此示例中,CustomHealthIndicator 类实现 HealthIndicator 接口并重写 health() 方法。在 health() 方法中,您可以编写自定义运行状况检查逻辑。如果组件运行正常,则可以返回 Health.up()。否则,您可以使用 withDetail() 方法返回 Health.down() 以及其他详细信息。
创建自定义运行状况指示器后,Spring Boot Actuator 将自动检测到它,并通过 /actuator/health 端点公开其运行状况检查。
要在 Spring Boot 中创建自定义 Actuator 端点,您可以按照下列步骤操作:
下面是创建自定义执行器端点的示例:
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.boot.actuate.endpoint.annotation.WriteOperation;
import org.springframework.stereotype.Component;
@Component
@Endpoint(id = "customEndpoint")
public class CustomEndpoint {
@ReadOperation
public String getInformation() {
// 检索和返回信息
return "这是自定义终结点信息。";
}
@WriteOperation
public void updateInformation(String newInformation) {
// 更新信息
// ...
}
}
在此示例中,CustomEndpoint 类使用 @Endpoint 进行批注,以将其定义为 Actuator 终结点。它有两个操作:getInformation() 用 @ReadOperation 注释用于检索信息,updateInformation() 用 @WriteOperation 注释用于更新信息。
创建自定义终结点后,它将自动注册到 Spring Boot Actuator,您可以通过 /actuator 基本路径和终结点 ID 访问它。在这种情况下,可以通过 /actuator/customEndpoint 访问自定义终结点。
若要在 Spring Boot 应用程序中启用跨域资源共享 (CORS),可以执行以下步骤:
添加 CORS 配置:创建一个配置类并使用 @Configuration 对其进行批注以定义 CORS 配置。在类中,创建一个 CorsFilter 类型的 Bean 来配置 CORS 设置。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
// 允许来自任何来源的请求
config.addAllowedOrigin("*");
// 允许特定的 HTTP methods (e.g., GET, POST, PUT, DELETE)
config.addAllowedMethod("*");
// 允许特定的 HTTP headers
config.addAllowedHeader("*");
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}
在此示例中,我们将 CORS 配置为允许来自任何源 的请求、允许所有 HTTP 方法 和允许所有 HTTP 标头 。您可以根据特定要求自定义这些设置。
启用 Web MVC 配置:如果尚未启用此操作,请确保通过在配置类上使用 @EnableWebMvc 注释或扩展 WebMvcConfigurerAdapter 类,在 Spring Boot 应用程序中启用 Web MVC 配置。
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter {
// 如果需要,其他 Web MVC 配置
}
测试 CORS 配置:在 Spring Boot 应用程序中启用 CORS 后,可以通过向终端节点发出跨域请求来测试它。确保响应中包含必要的 CORS 标头,例如 Access-Control-Allow-Origin、Access-Control-Allow-Methods 和 Access-Control-Allow-Headers。
启用 CORS 后,Spring Boot 应用程序可以处理跨域请求并做出适当的响应。请务必考虑安全隐患,并根据应用程序的要求和安全策略配置 CORS 设置。
在 Spring Boot 应用程序中,您可以使用 Spring 的任务调度功能提供的@Scheduled注解来调度任务。以下是在 Spring Boot 应用程序中计划任务的方法:
启用计划:首先,确保在 Spring Boot 应用程序中启用了任务计划。这可以通过在配置类上使用 @EnableScheduling 注释或在主应用程序类上添加@SpringBootApplication注释以及@EnableScheduling来完成。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
public class MyAppApplication {
public static void main(String[] args) {
SpringApplication.run(MyAppApplication.class, args);
}
}
创建计划任务方法:在应用程序中定义要计划的方法。用 @Scheduled 注释方法,并使用 cron、固定延迟或固定速率指定所需的调度表达式。
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class MyScheduledTasks {
@Scheduled(cron = "0 0 8 * * *") //每天早上 8 点跑
public void executeTask() {
System.out.println("计划任务已执行!");
}
}
在此示例中,该executeTask()方法计划根据提供的 cron 表达式在每天上午 8 点运行。
测试计划任务:定义计划任务后,可以启动 Spring Boot 应用程序并观察根据指定计划执行的计划任务。
@Scheduled注释提供了多个用于指定调度表达式的选项,包括 cron 表达式、固定延迟和固定速率。您可以根据计划要求选择最合适的选项。
若要在 Spring Boot 应用程序中启用缓存,可以按照下列步骤操作:
添加缓存依赖项:确保必要的缓存依赖项包含在项目的依赖项中。Spring Boot 支持各种缓存提供程序,例如 Ehcache、Redis 和 Caffeine。将相应的缓存依赖项添加到项目的pom.xml文件中。
例如,要使用 Ehcache 缓存提供程序,请添加以下依赖项:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-cacheartifactId>
dependency>
<dependency>
<groupId>net.sf.ehcachegroupId>
<artifactId>ehcacheartifactId>
dependency>
启用缓存:要在 Spring Boot 应用程序中启用缓存,请@EnableCaching将注释添加到配置类中。此注解启用了 Spring 的缓存基础结构,并为应用程序准备了缓存。
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableCaching
public class CachingConfig {
//其他配置
}
批注缓存方法:确定应用程序中要缓存的方法,并使用适当的缓存批注对其进行批注。Spring Boot 为缓存操作提供了 @Cacheable、@CachePut 和 @CacheEvict 等注释。
例如,假设您有一个从数据库检索数据的方法,并且您想要缓存结果。可以使用 @Cacheable 对方法进行批注并指定缓存名称。
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@Service
public class DataService {
@Cacheable("dataCache")
public Data getData(String key) {
// 从数据库或外部服务获取数据的逻辑
return data;
}
}
在此示例中,getData() 方法使用 @Cacheable 进行注释,并将缓存名称指定为“dataCache”。首次使用特定键调用此方法时,将提取并缓存数据。使用相同键的后续调用将从缓存中检索数据,而不是执行该方法。
配置缓存设置:如果需要自定义缓存行为,可以提供特定于所选缓存提供程序的其他配置属性。可以在 application.properties 或 application.yml 文件中设置这些配置属性。
例如,如果您使用的是 Ehcache,则可以在 ehcache.xml 文件中配置缓存设置,并在 application.properties 文件中指定文件的位置。
通过执行这些步骤,您可以在 Spring Boot 应用程序中启用缓存,并利用缓存的优势来提高性能并减少数据库或外部服务调用。
总之,这些 Spring Boot 面试问题涵盖了与 Spring Boot、其功能和最佳实践相关的广泛主题。通过熟悉这些问题及其答案,您可以更好地准备 Spring Boot 面试,并展示您在开发 Spring Boot 应用程序方面的知识和专业知识。