题目:SpringBoot和Spring的区别是什么?
难度:difficulty/low
标签:spring/boot, general/knowledge, difficulty/low
评分:⭐⭐⭐⭐☆(4/5)
Spring Boot 是 Spring 的一个封装,它把大量的 Spring 的衍生功能、常用的功能都封装起来,让你可以即时的启用,直接即拿即用。通过简单的配置就可以启用对应的功能,快速的启动服务,简单的开发,提高研发的效率。并且它把项目的架构基本都设计好了,在它内部有比较规范的设定,按它的规范填充业务,可以很快速的完成业务开发。它的核心在于约定大于配置,很多东西它是规约好了,你不需要配置,你想改你就可以改,但是不改的情况下,它会有一个自己行,有行业内的默认配置去帮助你使用。另外就是他把大量的功能封装成了一个个 star,方便大家使用,直接引入就可以进行正常的使用。
优点:
不足:
补充:
| 维度 | Spring | Spring Boot |
|---|---|---|
| 配置方式 | 大量 XML/JavaConfig,繁琐 | 约定大于配置,@SpringBootApplication 一个注解跑起来 |
| 自动配置 | 需手动组装 | AutoConfiguration + 条件注解自动装配 |
| 部署方式 | WAR 部署到外部 Tomcat | 内嵌容器,java -jar 直接跑 |
| 依赖管理 | 手动配版本,易冲突 | Starter 一站式 + BOM 依赖锁定 |
加分项:Spring Boot 不是独立框架,它依然依赖 Spring 的 IoC、AOP、MVC 等核心,只是把"搭建过程"标准化了。
核心考点定位:考察对 Spring Boot 设计哲学的理解,以及是否清楚其内部自动配置的机制。
知识点拆解:
@SpringBootConfiguration:标识这是一个 Spring 配置类(本质是 @Configuration)@EnableAutoConfiguration:启用自动配置,触发 AutoConfigurationImportSelector 扫描 starter 中的自动配置类@ComponentScan:扫描启动类所在包及其子包下的组件META-INF/spring.factories 中的 EnableAutoConfiguration 键,加载列出的自动配置类META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件@Conditional 系列注解(@ConditionalOnClass、@ConditionalOnMissingBean、@ConditionalOnProperty)决定是否生效——这就是"约定大于配置"的底层实现@AutoConfiguration 注解,配合 AutoConfiguration.imports 做延迟加载java -jar xxx.jar 直接启动,无需部署到外部 Servlet 容器;这是 Spring Boot 生产部署最大便利application.yml → application-{profile}.yml → 命令行参数 → 环境变量 → 配置中心(Nacos/Apollo),按优先级覆盖/actuator/health、/actuator/info、/actuator/metrics、/actuator/env 等生产级端点,支持健康检查、指标暴露、优雅停机考察方向:
延伸递进面试题:
面试官您好,Spring Boot 本身不是一个独立框架,它是基于 Spring 做的一整套"快速启动 + 开箱即用"的工具链。它的核心价值是把 Spring 传统开发中繁琐的 XML/JavaConfig 配置、依赖版本协调、容器部署等负担都收敛掉了。
从核心机制上讲,Spring Boot 提供了 @SpringBootApplication 这个顶层注解,它内部相当于三个组合:@SpringBootConfiguration(本质是 @Configuration)+ @EnableAutoConfiguration(启用自动配置)+ @ComponentScan(扫描启动类所在包)。自动配置是它最精髓的部分——启动时通过 AutoConfigurationImportSelector 扫描所有 starter jar 里的自动配置类,然后用 @ConditionalOnClass、@ConditionalOnMissingBean、@ConditionalOnProperty 这些条件注解决定是否生效。也就是说,Spring Boot 会"猜你想用":classpath 里有 spring-webmvc 它就自动装配 DispatcherServlet;你自己在配置类里显式 @Bean 声明了 DataSource,它就用你的、不用默认的。这就是"约定大于配置但可覆盖"的底层实现。
从工程实践上讲,Spring Boot 有几个杀手级能力:
第一,Starter 依赖,比如 spring-boot-starter-web 一个依赖就打包了 webmvc、内嵌 tomcat、jackson、spring-web 等一整套,配合 BOM 管理版本,彻底解决了 Maven 依赖版本冲突的历史痛点。
第二,内嵌容器,Tomcat/Jetty/Undertow 被打包进 JAR,直接 java -jar 就能跑,不需要部署到外部 Tomcat,这是生产部署最大的便利。
第三,配置外部化,application.yml 支持 profile 分环境、命令行参数、环境变量、配置中心(Nacos/Apollo)层层覆盖。
第四,Actuator 监控,内置 /actuator/health、/metrics、/info 等生产端点,配合 Spring Boot Admin 就能搭建一套完整的服务监控体系。
到 Spring Boot 3 又有一些新变化:包名从 javax. 迁移到 jakarta.、支持 GraalVM 原生镜像、支持虚拟线程(@EnableVirtualThreads)、spring.factories 被 AutoConfiguration.imports 取代以支持延迟加载。总之,Spring Boot 不是替代 Spring,而是把 Spring 的搭建过程标准化了,让我们能专注于业务而不是配置。