一、什么是 SpringBoot?
SpringBoot 是 Spring 生态下的快速开发脚手架,核心目标是 “简化 Spring 应用的开发、配置、部署流程”。
它并非替代 Spring,而是基于 Spring 框架,通过 “约定优于配置(Convention over Configuration)” 的设计思想,整合了 Spring 核心、Spring MVC、嵌入式服务器、依赖管理等功能,让开发者无需手动配置大量 XML 或注解,就能快速搭建可运行的生产级应用。
简单说:SpringBoot = Spring 核心 + 自动配置 + 起步依赖 + 嵌入式服务器 + 监控支持。

二、SpringBoot 核心及原理
1. 三大核心特性
(1)自动配置(AutoConfiguration)
• 核心目标:根据项目依赖(如引入 spring-boot-starter-web),自动配置 Spring 容器中的 Bean(如DispatcherServlet、DataSource),无需手动编写配置。
• 实现原理:
a. 核心注解 @EnableAutoConfiguration(被 @SpringBootApplication 包含)触发自动配置;
b. Spring 启动时,通过 SpringFactoriesLoader 扫描类路径下
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件(SpringBoot 2.7+ 版本,旧版本是 spring.factories),加载所有自动配置类(如 WebMvcAutoConfiguration、
DataSourceAutoConfiguration);
c. 自动配置类通过 条件注解(@Conditional 系列) 判断是否生效(如 @ConditionalOnClass 检查依赖是否存在、@ConditionalOnMissingBean 检查用户是否自定义了该 Bean);
d. 生效的自动配置类通过 @Bean 向容器注入默认配置的组件。
(2)起步依赖(Starter Dependencies)
• 核心目标:简化 Maven/Gradle 依赖管理,避免手动导入多个相关依赖(如 Spring MVC + 嵌入式 Tomcat + Jackson)。
• 实现原理:
○ 起步依赖是 “依赖聚合”,每个 Starter(如 spring-boot-starter-web)内部已包含该场景所需的所有核心依赖,且版本由 SpringBoot 统一管理(避免版本冲突);
○ 命名规范:官方 Starter 命名为 spring-boot-starter-xxx(如
spring-boot-starter-data-jpa),第三方 Starter 一般命名为 xxx-spring-boot-starter(如
mybatis-spring-boot-starter)。
(3)嵌入式服务器(Embedded Server)
• 核心目标:无需额外部署外部服务器(如 Tomcat、Jetty),应用可直接通过 java -jar 启动。
• 默认支持:Tomcat(默认)、Jetty、Undertow,可通过排除默认依赖、引入对应 Starter 切换(如切换为 Jetty)。
• 原理:SpringBoot 将服务器封装为依赖,启动时通过 ServerFactory 自动创建服务器实例并绑定端口。
2. 其他核心组件
• 外部化配置(Externalized Configuration):支持多种配置方式(
application.properties/yml、环境变量、命令行参数等),通过 @Value 或 @ConfigurationProperties 注入配置,方便多环境切换。
• Actuator:提供生产级监控能力(如健康检查、指标统计、日志查看),通过
spring-boot-starter-actuator 依赖启用,访问 /actuator/* 端点获取信息。
• SpringBoot Application 主类:标注 @SpringBootApplication 的类是启动入口,通过 SpringApplication.run(Application.class, args) 启动 Spring 容器,触发自动配置和组件扫描。
三、SpringBoot 应用场景
SpringBoot 是 Java 后端开发的“万能脚手架”,核心应用场景如下:
1. 微服务基石:SpringCloud 微服务生态的核心组件(如 Eureka、Gateway、Feign)均基于 SpringBoot 开发,每个微服务实例本质是一个 SpringBoot 应用;
2. Web 应用开发:快速搭建 RESTful API、前后端分离项目后端、管理系统(如 SpringBoot + Vue/React);
3. 数据处理应用:整合 MyBatis、JPA、Redis 等数据层框架,开发数据查询、批量处理、缓存服务;
4. 企业级应用:整合 Spring Security(权限)、Shiro、Activiti(工作流)等组件,开发 OA、CRM、ERP 等系统;
5. 云原生应用:支持 Docker 容器化、K8s 部署,天然适配云环境(如阿里云、AWS);
6. 定时任务/消息队列消费者:简单搭建定时任务(@Scheduled)、RabbitMQ/Kafka 消息消费者。
四、SpringBoot 优点和缺点
优点
1. 开发效率极高:自动配置替代繁琐配置,起步依赖简化依赖管理,无需手动整合 Spring 组件;
2. 开箱即用:内置嵌入式服务器,java -jar 直接启动,无需部署外部服务器;
3. 生态完善:无缝兼容 Spring 所有生态(Spring MVC、Spring Data、Spring Security),且支持主流第三方框架(MyBatis、Redis、RabbitMQ);
4. 生产级支持:Actuator 监控、健康检查、日志集成(SLF4J/Logback)、多环境配置,直接满足生产需求;
5. 兼容性好:支持 Java 8+,兼容各种开发工具(IDEA、Eclipse),部署方式灵活(Jar 包、War 包、容器化);
6. 降低学习成本:对 Spring 新手友善,无需深入理解 Spring 底层配置即可开发应用。
缺点
1. 灵活性不足:“约定优于配置”导致自定义复杂配置时,需要覆盖默认约定,反而比原生 Spring 繁琐(如复杂的数据源路由、自定义 Spring MVC 拦截器链);
2. 包体积较大:嵌入式服务器 + 自动依赖导致 Jar 包体积一般在 20MB+,不适合对体积敏感的场景(如嵌入式设备);
3. 底层封装过深:问题排查难度高(如自动配置失效时,需要深入理解自动配置原理才能定位);
4. 学习曲线隐形:看似简单,但要掌握自定义配置、原理、优化,仍需扎实的 Spring 基础;
5. 版本迭代快:部分旧版本 Starter 或自定义配置可能在新版本中不兼容(如 SpringBoot 2.x 与 1.x 差异较大)。
五、如何搭建 SpringBoot 框架
搭建方式有 2 种:Spring Initializr(推荐) 和 手动搭建,以下以 Maven + Java 8 为例。
方式 1:Spring Initializr(IDEA 集成,最快)
1. 打开 IDEA → New Project → 选择 Spring Initializr(默认使用官方地址 https://start.spring.io);
2. 填写项目信息:
○ Group(组织名,如 com.example)、Artifact(项目名,如 springboot-demo);
○ 版本(如 2.7.15,稳定版)、Java 版本(8);
3. 选择依赖:
○ 必选:Spring Web(Web 应用核心,包含 Spring MVC + Tomcat);
○ 可选:Spring Data JPA(数据访问)、Redis(缓存)、Actuator(监控);
4. 点击 Finish,IDEA 自动生成项目结构和配置文件。
方式 2:手动搭建(理解底层依赖)
步骤 1:创建 Maven 项目
新建普通 Maven 项目,在 pom.xml 中添加 SpringBoot 核心依赖:
|
XML <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.15</version> <!– 稳定版 –> <relativePath/> </parent> <!– 2. 添加起步依赖(Web 场景) –> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <!– 3. 打包插件(支持 java -jar 启动) –> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> |
步骤 2:创建主启动类
在 src/main/java/com/example 下创建主类(必须包含 @SpringBootApplication 注解):
|
package com.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; // 核心注解:= @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan @SpringBootApplication public class SpringBootDemoApplication { public static void main(String[] args) { // 启动 Spring 容器 SpringApplication.run(SpringBootDemoApplication.class, args); } } |
步骤 3:创建测试接口
创建 Controller 类,编写一个简单的 RESTful 接口:
|
Java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController // = @Controller + @ResponseBody public class HelloController { @GetMapping(“/hello”) public String hello() { return “Hello SpringBoot!”; } } |
步骤 4:启动并测试
1. 运行主类的 main 方法;
2. 启动成功后,访问
http://localhost:8080/hello,页面显示 Hello SpringBoot! 即搭建成功。
步骤 5:自定义配置(可选)
在 src/main/resources 下创建 application.yml(推荐,比 properties 简洁),修改端口、应用名:
|
spring: application: name: springboot-demo # 应用名 server: port: 8081 # 端口改为 8081 |
六、SpringBoot 常见面试题(基础 + 进阶 + 高级)
(一)基础面试题
1. SpringBoot 是什么?它的核心优势是什么?
• 答案:SpringBoot 是 Spring 生态的快速开发脚手架,核心是“约定优于配置”,无需手动整合 Spring 组件和配置 XML。核心优势:① 自动配置;② 起步依赖;③ 嵌入式服务器;④ 开箱即用的生产级支持;⑤ 开发效率高。
2. @SpringBootApplication 注解包含哪些核心注解?各自作用是什么?
• 答案:@SpringBootApplication 是复合注解,包含 3 个核心注解:
a. @SpringBootConfiguration:标记当前类是配置类,等价于 @Configuration;
b. @EnableAutoConfiguration:触发自动配置,加载类路径下的自动配置类;
c. @ComponentScan:扫描当前包及其子包下的组件(@Controller、@Service、@Repository 等),默认扫描主启动类所在包。
3. SpringBoot 支持哪些配置文件格式?优先级是什么?
• 答案:支持 3 种格式:
a. application.properties(键值对格式);
b. application.yml(yaml 格式,推荐,简洁);
c. application.yaml(与 yml 等价)。优先级:application.properties > application.yml > application.yaml(同目录下,高优先级覆盖低优先级);多环境配置:通过 spring.profiles.active=dev 激活 application-dev.yml 等环境配置文件。
4. SpringBoot 的自动配置原理是什么?
• 答案:核心流程:
a. 主启动类的 @EnableAutoConfiguration 注解触发自动配置;
b. SpringFactoriesLoader 扫描
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件,加载所有自动配置类;
c. 自动配置类通过 @Conditional 系列注解(如 @ConditionalOnClass、@ConditionalOnMissingBean)判断是否生效;
d. 生效的自动配置类通过 @Bean 向 Spring 容器注入默认组件(如 DispatcherServlet)。
5. 什么是 SpringBoot Starter?举几个常用的 Starter 例子。
• 答案:Starter 是“依赖聚合包”,整合某一场景所需的所有核心依赖,避免手动导入多个依赖。常用 Starter:
○ spring-boot-starter-web:Web 应用(Spring MVC + Tomcat);
○
spring-boot-starter-data-jpa:JPA 数据访问;
○ spring-boot-starter-redis:Redis 缓存;
○
spring-boot-starter-security:权限控制;
○
spring-boot-starter-actuator:应用监控。
(二)进阶面试题
1. 如何禁用 SpringBoot 的某个自动配置类?
• 答案:2 种方式:
a. 用 @SpringBootApplication 的 exclude 属性:@SpringBootApplication(exclude =
DataSourceAutoConfiguration.class)(禁用数据源自动配置);
b. 在配置文件中指定:
spring.autoconfigure.exclude=
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration。
2. SpringBoot 嵌入式服务器有哪些?如何切换嵌入式服务器?
答案:默认支持 Tomcat(默认)、Jetty、Undertow。切换方式(以切换为 Jetty 为例):
|
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!– 排除默认 Tomcat 依赖 –> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!– 引入 Jetty 依赖 –> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency> |
3. 如何自定义 SpringBoot Starter?
• 答案:核心步骤(以 my-starter 为例):
a. 命名规范:第三方 Starter 命名为 xxx-spring-boot-starter;
b. 创建 Maven 项目,引入核心依赖(spring-boot-autoconfigure、spring-boot-starter);
c. 编写自动配置类(如 MyAutoConfiguration),用 @Conditional 注解控制生效条件,用 @Bean 注入组件;
d. 在
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中注册自动配置类;
e. 打包发布,其他项目引入该 Starter 即可自动生效。
4. SpringBoot 如何实现多环境配置?
• 答案:3 种常用方式:
a. 多配置文件:创建 application-dev.yml(开发)、application-test.yml(测试)、application-prod.yml(生产),通过 spring.profiles.active=dev 激活;
b. 命令行参数:启动时指定 java -jar app.jar –spring.profiles.active=prod;
c. 环境变量:设置系统环境变量 SPRING_PROFILES_ACTIVE=prod(SpringBoot 自动读取环境变量)。
5. SpringBoot Actuator 的作用是什么?常用端点有哪些?
• 答案:Actuator 提供生产级监控能力,暴露 HTTP 端点获取应用运行状态。常用端点:
○ /actuator/health:健康检查(默认开启);
○ /actuator/info:应用信息(需配置 info.* 属性);
○ /actuator/metrics:系统指标(如 JVM 内存、CPU 使用率);
○ /actuator/loggers:日志配置;
○ /actuator/shutdown:关闭应用(默认禁用,需开启
management.endpoint.shutdown.enabled=true)。
(三)高级面试题
1. SpringBoot 的启动流程是什么?
• 答案:核心流程(简化版):
a. 执行主类 main 方法,调用 SpringApplication.run();
b. 初始化 SpringApplication 实例:设置应用类型(Web/非 Web)、加载初始化器(
ApplicationContextInitializer)、监听器(ApplicationListener);
c. 启动应用:触发 ApplicationStartingEvent 事件;
d. 准备环境:加载配置文件、环境变量,触发
ApplicationEnvironmentPreparedEvent;
e. 创建 ApplicationContext(Spring 容器):Web 应用默认创建
AnnotationConfigServletWebServerApplicationContext;
f. 刷新容器:
▪ 执行 BeanFactoryPostProcessor(后置处理器);
▪ 扫描并注册组件(@Component 等);
▪ 执行自动配置(@EnableAutoConfiguration);
▪ 初始化 Bean(执行 @PostConstruct、依赖注入);
g. 启动嵌入式服务器:创建 Tomcat/Jetty 实例,绑定端口;
h. 触发 ApplicationStartedEvent、ApplicationReadyEvent 事件,应用启动完成。
2. 如何优化 SpringBoot 应用的启动速度?
• 答案:核心优化方向:
a. 依赖优化:移除不必要的 Starter,避免冗余依赖;
b. 关闭无用自动配置:排除不需要的自动配置类(如
DataSourceAutoConfiguration 若无需数据库);
c. 延迟初始化:开启
spring.main.lazy-initialization=true,非必要 Bean 延迟到首次使用时初始化;
d. 优化 JVM 参数:调整堆内存(-Xms2g -Xmx2g)、使用 G1 垃圾回收器(-XX:+UseG1GC);
e. 减少组件扫描范围:指定 @ComponentScan(basePackages = “com.example.core”),避免扫描无关包;
f. 打包优化:使用 spring-boot-maven-plugin 的 layers 功能,分离依赖和业务代码,加速容器部署。
3. SpringBoot 中 @Conditional 注解的作用是什么?常见的条件注解有哪些?
• 答案:@Conditional 是 Spring 的条件注解,用于控制 Bean 或配置类是否生效,是自动配置的核心。常见条件注解:
○ @ConditionalOnClass:类路径下存在指定类时生效;
○ @ConditionalOnMissingClass:类路径下不存在指定类时生效;
○ @ConditionalOnBean:容器中存在指定 Bean 时生效;
○ @ConditionalOnMissingBean:容器中不存在指定 Bean 时生效(用户自定义 Bean 优先);
○ @ConditionalOnProperty:配置文件中存在指定属性且值匹配时生效(如 @ConditionalOnProperty(prefix = “spring.datasource”, name = “url”));
○ @
ConditionalOnWebApplication:Web 应用环境下生效。
4. SpringBoot 如何处理跨域问题?
• 答案:3 种常用方式:
a. 全局配置(推荐):实现 WebMvcConfigurer 接口,重写 addCorsMappings:
|
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(“/**”) // 所有接口 .allowedOrigins(“*”) // 允许所有源(生产环境指定具体域名) .allowedMethods(“GET”, “POST”, “PUT”, “DELETE”) // 允许请 .allowedHeaders(“*”) // 允许所有请求头 .maxAge(3600); // 预检请求缓存时间 } |
b. 局部注解:在 Controller 或方法上添加 @CrossOrigin;
c. 过滤器:自定义 CorsFilter,手动设置跨域响应头。
5. 微服务架构中,SpringBoot 应用如何实现配置中心和服务发现?
• 答案:结合 SpringCloud 组件实现:
a. 配置中心:使用 SpringCloud Config 或 Nacos Config,将配置聚焦存储(Git/Nacos 服务器),SpringBoot 应用通过
spring-cloud-starter-config 或
spring-cloud-starter-alibaba-nacos-config 依赖拉取配置,支持动态刷新;
b. 服务发现:使用 Eureka、Nacos 或 Consul,SpringBoot 应用通过
spring-cloud-starter-netflix-eureka-client 或
spring-cloud-starter-alibaba-nacos-discovery 依赖注册到服务注册中心,其他服务通过 Feign/Gateway 调用。