P41 有没有出现 Spring 正常 SpringBoot 报错的情况?
面试题:有没有遇到过 Spring 项目运行正常,但改成 SpringBoot 后报错的场景?为什么?
背景
SpringBoot 简化了配置,但自动配置(AutoConfiguration)带来的默认行为和依赖管理,会让一些"在传统 Spring 里正常"的写法失效。
常见原因与场景
① 依赖版本冲突 / 传递依赖不同
- SpringBoot 用 BOM(统一版本管理) 锁定了一堆依赖版本;
- 传统 Spring 项目里自己指定的版本(如旧版 Spring、旧版 Jackson)可能与 SpringBoot 的默认版本冲突;
- 表现:
NoSuchMethodError、ClassNotFoundException、Bean 注入报错。
② 自动配置覆盖了手动配置
- SpringBoot 会按条件自动装配(如数据源、Redis、MQ);
- 传统项目手写的 XML/Java 配置与自动配置冲突,或多个同类 Bean 导致注入歧义;
- 表现:
NoUniqueBeanDefinitionException、配置不生效。
③ 扫描路径问题
- SpringBoot 默认只扫描启动类所在包及其子包;
- 传统 Spring 用
component-scan指定了多个包路径,移到 SpringBoot 后没迁移,Bean 没被扫到; - 表现:
NoSuchBeanDefinitionException。
④ 配置文件差异
application.properties/yml的约定与 Spring XML 配置不同;- 原来 XML 里的
<context:property-placeholder>等配置没迁移,属性注入为 null。
⑤ 内嵌容器行为差异
- SpringBoot 用内嵌 Tomcat,传统项目部署在外置 Tomcat;
- 静态资源路径、JSP 支持、Servlet 3.0 异步、
web.xml过滤器等行为不同; - 表现:页面 404、过滤器不生效。
解决思路
- 看启动日志的 AutoConfiguration 报告(
debug=true),确认哪些自动配置生效/排除; - 用
@SpringBootApplication(exclude = ...)排除冲突的自动配置; - 统一依赖版本:用 SpringBoot BOM,删掉多余的版本声明;
- 迁移配置:XML → 注解/Java Config,包扫描范围显式指定;
- 遇到 NoSuchBean 先查扫描路径、Bean 定义、条件注解。
加分点
- 说出自动配置的底层机制:
@EnableAutoConfiguration+spring.factories/AutoConfiguration.imports+@ConditionalOnXxx; - 面试官欣赏"会看自动配置报告、会 exclude"的实操经验。
一句话总结
Spring 正常、SpringBoot 报错,多半是自动配置/依赖版本/扫描路径/容器行为的默认值变化导致:看自动配置报告、排除冲突配置、统一 BOM 版本、迁移包扫描即可解决。