Spring Boot面试题
2026/1/15大约 4 分钟SpringSpring BootJava微服务后端
Spring Boot面试题
基础概念
1. Spring Boot 的核心特性有哪些?
答案:
自动配置(Auto-Configuration)
- 根据类路径依赖自动配置 Spring 应用
- 使用条件注解决定配置是否生效
起步依赖(Starter Dependencies)
- 简化依赖管理
- 一个 Starter 包含所有相关依赖
嵌入式容器
- 内置 Tomcat、Jetty、Undertow
- 无需部署 WAR 包
生产就绪特性
- Actuator 监控
- 健康检查、指标收集
外部化配置
- 支持多种配置源
- Profile 多环境配置
2. @SpringBootApplication 注解的作用是什么?
答案:
@SpringBootApplication 是一个组合注解,包含三个核心注解:
@SpringBootConfiguration // 等同于 @Configuration,标识配置类
@EnableAutoConfiguration // 启用自动配置
@ComponentScan // 组件扫描
public @interface SpringBootApplication { }@SpringBootConfiguration:标识这是一个配置类@EnableAutoConfiguration:启用自动配置机制@ComponentScan:扫描当前包及子包下的组件
3. Spring Boot 的自动配置原理是什么?
答案:
自动配置流程:
加载自动配置类
@EnableAutoConfiguration导入AutoConfigurationImportSelector- 从
META-INF/spring.factories加载所有自动配置类
条件过滤
- 使用
@ConditionalOnClass、@ConditionalOnBean等条件注解 - 只有满足条件的配置类才会生效
- 使用
配置属性绑定
- 通过
@ConfigurationProperties绑定配置属性 - 用户可以通过配置文件覆盖默认值
- 通过
4. Spring Boot 和 Spring 有什么区别?
答案:
| 特性 | Spring | Spring Boot |
|---|---|---|
| 配置方式 | XML/注解,需要大量配置 | 自动配置,约定优于配置 |
| 依赖管理 | 手动管理依赖版本 | Starter 统一管理 |
| 部署方式 | 需要外部容器 | 内嵌容器,可执行 JAR |
| 监控管理 | 需要额外集成 | Actuator 开箱即用 |
| 开发效率 | 较低 | 高 |
配置相关
5. Spring Boot 配置文件的加载优先级是怎样的?
答案:
从高到低:
- 命令行参数
- SPRING_APPLICATION_JSON 环境变量
- ServletConfig/ServletContext 参数
- JNDI 属性
- Java 系统属性
- 操作系统环境变量
- jar 包外的 application-{profile}.yml
- jar 包内的 application-{profile}.yml
- jar 包外的 application.yml
- jar 包内的 application.yml
- @PropertySource 注解
- 默认属性
6. 如何实现多环境配置?
答案:
- 创建多个配置文件
application.yml # 公共配置
application-dev.yml # 开发环境
application-test.yml # 测试环境
application-prod.yml # 生产环境- 激活 Profile
# application.yml
spring:
profiles:
active: dev# 命令行
java -jar app.jar --spring.profiles.active=prod
# 环境变量
export SPRING_PROFILES_ACTIVE=prod7. @Value 和 @ConfigurationProperties 有什么区别?
答案:
| 特性 | @Value | @ConfigurationProperties |
|---|---|---|
| 使用方式 | 单个属性注入 | 批量属性绑定 |
| 松散绑定 | 不支持 | 支持(驼峰、下划线、短横线) |
| SpEL | 支持 | 不支持 |
| 校验 | 不支持 | 支持 @Validated |
| 复杂类型 | 不方便 | 支持嵌套对象、List、Map |
// @Value
@Value("${app.name}")
private String name;
// @ConfigurationProperties
@ConfigurationProperties(prefix = "app")
public class AppProperties {
private String name;
private List<String> servers;
// getters and setters
}自动配置
8. 常用的条件注解有哪些?
答案:
| 注解 | 说明 |
|---|---|
@ConditionalOnClass | 类路径存在指定类 |
@ConditionalOnMissingClass | 类路径不存在指定类 |
@ConditionalOnBean | 容器中存在指定 Bean |
@ConditionalOnMissingBean | 容器中不存在指定 Bean |
@ConditionalOnProperty | 配置属性满足条件 |
@ConditionalOnResource | 资源文件存在 |
@ConditionalOnWebApplication | Web 应用 |
@ConditionalOnExpression | SpEL 表达式为 true |
9. 如何自定义一个 Spring Boot Starter?
答案:
- 创建自动配置类
@Configuration
@ConditionalOnClass(MyService.class)
@EnableConfigurationProperties(MyProperties.class)
public class MyAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public MyService myService(MyProperties properties) {
return new MyService(properties);
}
}- 创建配置属性类
@ConfigurationProperties(prefix = "my")
public class MyProperties {
private String name;
// getters and setters
}- 注册自动配置类
# META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyAutoConfiguration- 创建 Starter 模块
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>my-autoconfigure</artifactId>
</dependency>
</dependencies>10. 如何禁用某个自动配置类?
答案:
// 方式1:@SpringBootApplication exclude
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class Application { }
// 方式2:配置文件
spring:
autoconfigure:
exclude:
- org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfigurationActuator
11. Spring Boot Actuator 提供了哪些端点?
答案:
| 端点 | 说明 |
|---|---|
/health | 健康检查 |
/info | 应用信息 |
/metrics | 指标数据 |
/env | 环境配置 |
/beans | 所有 Bean |
/mappings | 请求映射 |
/loggers | 日志配置 |
/threaddump | 线程转储 |
/heapdump | 堆转储 |
/shutdown | 关闭应用 |
12. 如何自定义健康检查?
答案:
@Component
public class CustomHealthIndicator implements HealthIndicator {
@Override
public Health health() {
boolean healthy = checkService();
if (healthy) {
return Health.up()
.withDetail("service", "Available")
.build();
} else {
return Health.down()
.withDetail("error", "Service unavailable")
.build();
}
}
}实战问题
13. Spring Boot 应用如何优雅停机?
答案:
# 配置优雅停机
server:
shutdown: graceful
spring:
lifecycle:
timeout-per-shutdown-phase: 30s// 或者监听关闭事件
@Component
public class GracefulShutdown implements ApplicationListener<ContextClosedEvent> {
@Override
public void onApplicationEvent(ContextClosedEvent event) {
// 清理资源
// 等待任务完成
}
}14. 如何解决 Spring Boot 启动慢的问题?
答案:
- 排除不需要的自动配置
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class,
RedisAutoConfiguration.class
})- 使用懒加载
spring:
main:
lazy-initialization: true- 减少组件扫描范围
@ComponentScan(basePackages = "com.example.core")- 使用 Spring Boot DevTools
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>15. Spring Boot 如何实现热部署?
答案:
- 使用 DevTools
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>- 配置
spring:
devtools:
restart:
enabled: true
additional-paths: src/main/java
livereload:
enabled: true- IDE 配置
- IDEA:开启 Build project automatically
- Eclipse:自动编译
小结
本章汇总了 Spring Boot 相关的常见面试题,涵盖基础概念、配置管理、自动配置原理、Actuator 监控等方面。掌握这些知识点有助于深入理解 Spring Boot 的设计理念和最佳实践。
