🔧 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初始化逻辑。

🛠 更多免费工具

📝 简历生成器 ☕ 面试题库 🎯 模拟面试 🔍 AI简历诊断 🎤 自我介绍 📚 技术博客 📋 速查卡片 💰 薪资查询 🎯 JD押题器

© 2026 Java实习指南 · Abyte-zym · 更多文章