SpringBoot框架
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是简化Spring应用的初始搭建以及开发过程。核心理念:约定优于配置(Convention over Configuration),开箱即用。
一、Spring Boot 核心特性
1.1 四大核心
|
特性 |
说明 |
|---|---|
|
自动配置(Auto-configuration)
|
根据classpath中的依赖自动配置Spring应用。如classpath有H2→自动配置DataSource;有Thymeleaf→自动配置模板引擎 |
|
起步依赖(Starter) |
一站式引入依赖。spring-boot-starter-web引入SpringMVC+Tomcat+Jackson等全套Web开发依赖 |
|
内嵌容器 |
支持内嵌Tomcat/Jetty/Undertow,直接java -jar运行,无需部署WAR到外部Servlet容器 |
|
Actuator监控 |
提供生产级监控端点:健康检查、指标、环境信息、日志级别动态调整等 |
1.2 Spring Boot vs 传统Spring
|
对比 |
传统Spring |
Spring Boot |
|---|---|---|
|
项目搭建 |
手动配置web.xml、applicationContext.xml、springmvc.xml |
引入starter即可,零XML配置 |
|
依赖管理 |
手动引入每个依赖并处理版本冲突 |
spring-boot-starter-parent统一管理版本 |
|
部署运行 |
需外部Tomcat,打WAR包部署 |
内嵌Tomcat,java -jar直接运行 |
|
配置方式 |
XML配置为主 |
注解 + yml/properties |
二、自动配置原理
2.1 核心注解链
@SpringBootApplication = @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan
@EnableAutoConfiguration 工作机制
- @EnableAutoConfiguration → @Import(AutoConfigurationImportSelector.class)
- AutoConfigurationImportSelector 读取 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(Spring Boot 2.7前为spring.factories)
- 文件中列出了所有自动配置类(约150+个),如DataSourceAutoConfiguration、WebMvcAutoConfiguration
- 每个配置类通过 @ConditionalOnClass / @ConditionalOnMissingBean / @ConditionalOnProperty 等条件注解判断是否生效
- 如 DataSourceAutoConfiguration 判断 classpath 有DataSource类且未手动定义DataSource Bean → 自动创建HikariCP数据源
2.2 条件注解体系
|
条件注解 |
作用 |
|---|---|
|
@ConditionalOnClass |
classpath存在指定类时生效 |
|
@ConditionalOnMissingBean |
IoC容器中不存在指定Bean时生效 |
|
@ConditionalOnBean |
容器中存在指定Bean时生效 |
|
@ConditionalOnProperty |
配置文件中有指定属性且匹配值时生效 |
|
@ConditionalOnMissingClass |
classpath不存在指定类时生效 |
|
@ConditionalOnJava |
指定Java版本时生效 |
|
@ConditionalOnWebApplication |
Web应用环境下生效 |
2.3 如何自定义Starter
- 命名规范:官方:spring-boot-starter-xxx;自定义:xxx-spring-boot-starter
- 结构:autoconfigure模块(含AutoConfiguration类+META-INF/spring/xxx.imports)+ starter模块(空jar,仅pom引入autoconfigure和第三方依赖)
- 核心:@Configuration + @EnableConfigurationProperties(XxxProperties.class) + @ConditionalXXX + @Bean提供核心Bean
三、配置文件
3.1 application.yml vs application.properties
|
对比 |
.properties |
.yml |
|---|---|---|
|
格式 |
key=value,线性 |
阶梯缩进,树状层级 |
|
可读性 |
平铺冗长 |
层级清晰,推荐 |
|
多环境 |
多文件拆开 |
单文件---分隔多profile |
|
Map/List |
写法繁琐 |
原生支持 |
3.2 多环境配置
- application.yml:公共配置 + spring.profiles.active: dev 指定激活环境
- application-dev.yml / application-prod.yml:各环境专属配置,覆盖公共配置
- 优先级(高→低):命令行参数 → 环境变量 → application-{profile}.yml → application.yml
3.3 @ConfigurationProperties 类型安全配置
四、常用Starter一览
|
Starter |
作用 |
|---|---|
|
spring-boot-starter-web |
Web开发(SpringMVC + Tomcat) |
|
spring-boot-starter-test |
测试(JUnit5 + Mockito + AssertJ) |
|
spring-boot-starter-data-redis |
Redis数据访问(Lettuce默认连接) |
|
spring-boot-starter-data-jpa |
JPA(Hibernate)数据访问 |
|
mybatis-spring-boot-starter |
MyBatis整合 |
|
spring-boot-starter-validation |
参数校验(Hibernate Validator) |
|
spring-boot-starter-actuator |
生产监控端点 |
|
spring-boot-starter-security |
Spring Security安全框架 |
|
spring-boot-starter-aop |
AOP支持(@Aspect注解) |
|
spring-boot-starter-amqp |
RabbitMQ消息 |
|
spring-boot-starter-cache |
缓存抽象(支持Redis/Caffeine/Ehcache等) |
|
spring-boot-starter-mail |
邮件发送 |
五、Actuator 生产监控
5.1 常用端点
|
端点 |
作用 |
|---|---|
|
/actuator/health |
健康检查(UP/DOWN),可级联检查DB/Redis等组件状态 |
|
/actuator/info |
应用信息(自定义版本号/构建信息等) |
|
/actuator/metrics |
指标列表(JVM内存/GC/线程/HTTP请求等) |
|
/actuator/env |
环境变量/配置属性 |
|
/actuator/loggers |
日志级别查看与动态修改(POST请求修改) |
|
/actuator/threaddump |
线程快照dump(排查死锁/线程阻塞) |
|
/actuator/heapdump |
堆内存dump(OOM排查) |
|
/actuator/beans |
Spring容器中所有Bean列表 |
|
/actuator/mappings |
所有@RequestMapping路径列表 |
安全提醒:生产环境不要暴露全部端点到公网!通常只暴露health/info给负载均衡器探活,敏感端点需配置Spring Security + management.endpoints.web.exposure.include。
六、核心注解汇总
|
注解 |
作用 |
|---|---|
|
@SpringBootApplication |
主应用类注解,包含@Configuration + @EnableAutoConfiguration + @ComponentScan |
|
@Configuration |
声明配置类,配合@Bean创建Bean(proxyBeanMethods=true时为CGLIB代理) |
|
@Bean |
方法返回的对象纳入Spring容器管理 |
|
@ComponentScan |
组件扫描路径(默认扫描主类所在包及其子包) |
|
@ConditionalOnProperty |
根据配置决定是否启用某配置 |
|
@Import |
导入其他配置类或实现ImportSelector的类 |
|
@ImportResource |
导入XML配置文件(遗留系统兼容) |
七、跨域、拦截器、全局异常
7.1 跨域配置(CORS)
7.2 拦截器注册
7.3 全局异常处理
八、Servlet容器原理
8.1 内嵌Tomcat启动流程
- SpringApplication.run() → 创建ApplicationContext
- AbstractApplicationContext.refresh() → onRefresh() → 调用createWebServer()
- ServletWebServerFactory(TomcatServletWebServerFactory)创建Tomcat实例
- 配置Connector(端口、协议)、配置Context(应用路径)、注册Servlet Filter
- DispatcherServlet自动注册到Tomcat
- Tomcat.start() → 监听端口,就绪接收请求
8.2 切换容器
九、Spring Boot 3.x 新特性
|
特性 |
说明 |
|---|---|
|
JDK 17 基线 |
最低要求JDK 17,充分利用Record/Sealed Class/Pattern Matching等特性 |
|
Jakarta EE 9+ |
包名从javax.* 迁移到 jakarta.*(javax.servlet → jakarta.servlet) |
|
原生镜像支持 |
Spring Native + GraalVM AOT编译,启动时间亚秒级,内存大幅降低 |
|
虚拟线程支持 |
3.2+支持JDK 21虚拟线程(Virtual Threads)配置:spring.threads.virtual.enabled=true |
|
ProblemDetail |
RFC 7807标准错误响应格式(ErrorResponse规范) |
|
HttpExchange |
声明式HTTP客户端(类似OpenFeign),@HttpExchange标注接口方法 |
|
Observability |
Micrometer Tracing,整合Trace/Metrics/Logs三位一体可观测性 |
面试高频:
- 自动配置原理(@EnableAutoConfiguration + spring.factories/imports + 条件注解)
- Spring Boot启动流程(SpringApplication.run()内部步骤)
- Starter机制(如何自定义一个Starter)
- 配置文件加载优先级
- @ConfigurationProperties vs @Value
- 内嵌Tomcat原理
- Spring Boot 3.x 重大变更(JDK17/Jakarta/虚拟线程)