Skip to content

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、过滤器不生效。

解决思路 ​

  1. 看启动日志的 AutoConfiguration 报告(debug=true),确认哪些自动配置生效/排除;
  2. 用 @SpringBootApplication(exclude = ...) 排除冲突的自动配置;
  3. 统一依赖版本:用 SpringBoot BOM,删掉多余的版本声明;
  4. 迁移配置:XML → 注解/Java Config,包扫描范围显式指定;
  5. 遇到 NoSuchBean 先查扫描路径、Bean 定义、条件注解。

加分点 ​

  • 说出自动配置的底层机制:@EnableAutoConfiguration + spring.factories/AutoConfiguration.imports + @ConditionalOnXxx;
  • 面试官欣赏"会看自动配置报告、会 exclude"的实操经验。

一句话总结 ​

Spring 正常、SpringBoot 报错,多半是自动配置/依赖版本/扫描路径/容器行为的默认值变化导致:看自动配置报告、排除冲突配置、统一 BOM 版本、迁移包扫描即可解决。

基于 VitePress 重建