🔧 Spring Boot 核心面试10题
2026年5月更新 · 涵盖自动配置源码·Starter机制·Spring Boot 3新特性 · 面试出现率85%+
💡 这10道题覆盖Spring Boot面试最核心考点。Spring Boot 4.0已发布但3.x仍是主流——面试官更关注你对"自动配置"和"约定优于配置"的理解深度。
1. @SpringBootApplication 注解背后做了什么?
一行注解 = 三个注解的组合:
@SpringBootConfiguration:本质就是 @Configuration,标记这是一个配置类。
@EnableAutoConfiguration:🔥 核心!通过 AutoConfigurationImportSelector 读取 classpath 下 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(3.x 新位置,2.x 在 spring.factories),自动加载 100+ 配置类。
@ComponentScan:扫描当前包及子包下的 @Component/@Service/@Controller。
面试加分:提一下条件注解——@ConditionalOnClass/@ConditionalOnBean/@ConditionalOnProperty 按需生效。比如有 spring-boot-starter-web 才配 Tomcat,没有就不配。
2. Spring Boot 自动配置原理——能讲清楚 AutoConfigurationImportSelector 吗?
三步走:
1. @EnableAutoConfiguration 导入 AutoConfigurationImportSelector
2. selectImports() → SpringFactoriesLoader 读取 AutoConfiguration.imports 文件
3. 加载到的配置类逐个通过 @Conditional 条件注解过滤——满足条件的才实例化 Bean
面试官追问"你怎么知道加载了哪些自动配置?"
→ 答:启动时加 --debug 参数,控制台会打印 "Positive matches" 和 "Negative matches"。或者看 Actuator 的 /conditions 端点。
3. Starter 是什么?怎么自定义一个 Starter?
Starter = 依赖打包器。比如你引入 spring-boot-starter-web,它帮你把 Spring MVC、Tomcat、Jackson 全拉进来——你不需要一个个加依赖。
自定义 Starter 核心两步:
1. 写一个
xxx-spring-boot-autoconfigure 模块——含自动配置类 + AutoConfiguration.imports 文件
2. 写一个
xxx-spring-boot-starter 模块——pom里只引入上面的 autoconfigure 包
// 自动配置类示例
@Configuration
@ConditionalOnClass(SomeService.class)
@EnableConfigurationProperties(SomeProperties.class)
public class SomeAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public SomeService someService() { return new SomeServiceImpl(); }
}
4. @Transactional 失效的5个场景?
记住这5个——面试必问:
① 同类方法调用:this.method() 不经过代理对象,AOP不拦截
② 非 public 方法:Spring AOP 默认只代理 public 方法
③ 异常被 catch 吞掉:`try{...}catch(Exception e){//啥也不做}`,事务感知不到异常
④ rollbackFor 不匹配:默认只回滚 RuntimeException,受检异常要显式指定 `rollbackFor=Exception.class`
⑤ 数据库引擎不支持:比如用了 MyISAM(不支持事务)
5. Spring Boot 的配置文件加载顺序?
优先级从高到低(高覆盖低):
1. 命令行参数 --server.port=9090
2. 操作系统环境变量
3. jar包外部的 application-{profile}.yml
4. jar包内部的 application-{profile}.yml
5. jar包外部的 application.yml
6. jar包内部的 application.yml
多环境切换:spring.profiles.active=dev 激活 dev 配置。
6. Spring Boot Actuator 有哪些常用端点?怎么保护敏感端点?
6个最常用端点:
• /actuator/health — 健康检查(K8s探针用)
• /actuator/info — 应用信息
• /actuator/metrics — JVM内存/GC/CPU指标
• /actuator/loggers — 动态调日志级别
• /actuator/env — 环境变量(含密码,注意脱敏)
• /actuator/beans — 所有Spring Bean
安全保护:引入 spring-boot-starter-security → 配置 Actuator 单独端口或路径 → 加认证。
7. 拦截器(Interceptor)和过滤器(Filter)的区别?
4个核心区别:
① 容器不同:Filter 属于 Servlet 容器(Tomcat),Interceptor 属于 Spring MVC
② 触发时机:Filter 在请求进入 DispatcherServlet 之前执行;Interceptor 在进入 Controller 之前执行
③ 访问范围:Filter 可拦截所有请求(含静态资源);Interceptor 只能拦截 Controller 请求
④ 依赖注入:Interceptor 可以注入 Spring Bean(它是Spring管理的),Filter 默认不行
执行顺序:Filter → Interceptor → AOP → Controller
8. Spring Boot 3.x 相比 2.x 有哪些重要变化?
4个必知变化:
① JDK 17 基线:不再支持 Java 8/11
② Jakarta EE 替代 Java EE:所有 javax.* 改为 jakarta.*(比如 javax.servlet → jakarta.servlet)
③ GraalVM 原生镜像:spring-boot:build-image 直接编译成原生可执行文件
④ 自动配置注册:从 spring.factories 改为 AutoConfiguration.imports 文件
面试亮点:如果你简历写 Spring Boot 3.x,面试官很可能问"你们为什么选3.x"——答:虚拟线程支持(Project Loom)、原生编译、安全更新。
9. Spring Boot 怎么处理跨域(CORS)?
// 方式一:全局配置
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("https://你的前端域名.com")
.allowedMethods("GET","POST","PUT","DELETE")
.allowCredentials(true)
.maxAge(3600);
}
}
// 方式二:单接口
@CrossOrigin(origins = "https://你的前端域名.com")
@GetMapping("/data")
public R> getData() { return R.ok(data); }
10. Spring Boot 项目启动慢怎么排查?
3步定位:
① 加 --debug 看哪些自动配置加载了但你不需要
② Actuator 的 /actuator/startup 端点(需配置)——列出每个Bean初始化耗时
③ 用 @ComponentScan 缩小扫描范围,排除不需要的包
常见原因:扫描范围过大、数据库连接池初始化慢(Hikari默认30秒超时)、过多的@PostConstruct初始化逻辑。
☕ 觉得有用?请我杯咖啡
这些文章和工具会持续更新,你的支持是我熬夜写的动力 🔥
🛠 更多免费工具
© 2026 Java实习指南 ·
Abyte-zym ·
更多文章