目录
[2. 与 Spring Cloud 的版本对应(必须配套,不能乱搭)](#2. 与 Spring Cloud 的版本对应(必须配套,不能乱搭))
[3. 三代技术栈关键差异](#3. 三代技术栈关键差异)
[1. 创建项目](#1. 创建项目)
[2. 最小 pom 核心](#2. 最小 pom 核心)
[3. 启动类](#3. 启动类)
[4. 推荐分层结构](#4. 推荐分层结构)
[5. 运行方式](#5. 运行方式)
[1. 自动配置要解决什么](#1. 自动配置要解决什么)
[2. 工作机制](#2. 工作机制)
[3. 常用条件注解](#3. 常用条件注解)
[4. 一个典型自动配置类长什么样(会读即可)](#4. 一个典型自动配置类长什么样(会读即可))
[5. 属性绑定](#5. 属性绑定)
[四、IoC 与常用注解速查](#四、IoC 与常用注解速查)
[五、Web 开发(spring-boot-starter-web,基于 Spring MVC)](#五、Web 开发(spring-boot-starter-web,基于 Spring MVC))
[1. 常用 Controller 注解](#1. 常用 Controller 注解)
[2. 参数校验(Bean Validation)](#2. 参数校验(Bean Validation))
[3. 统一返回格式](#3. 统一返回格式)
[4. 全局异常处理(@RestControllerAdvice)](#4. 全局异常处理(@RestControllerAdvice))
[5. 拦截器与过滤器](#5. 拦截器与过滤器)
[6. HTTP 客户端(调外部服务)](#6. HTTP 客户端(调外部服务))
[1. 配置文件](#1. 配置文件)
[2. 外部化配置优先级(高 → 低,常考)](#2. 外部化配置优先级(高 → 低,常考))
[3. 随机值与占位符](#3. 随机值与占位符)
[1. 连接池:默认 HikariCP](#1. 连接池:默认 HikariCP)
[2. Spring Data JPA(starter-data-jpa)](#2. Spring Data JPA(starter-data-jpa))
[3. MyBatis / MyBatis-Plus(国内主流)](#3. MyBatis / MyBatis-Plus(国内主流))
[4. 事务管理](#4. 事务管理)
[5. 多数据源](#5. 多数据源)
[九、生产级特性(Spring Boot 的"生产就绪"能力)](#九、生产级特性(Spring Boot 的"生产就绪"能力))
[1. Spring Boot Actuator(运维端点)](#1. Spring Boot Actuator(运维端点))
[2. Micrometer 指标体系](#2. Micrometer 指标体系)
[3. 优雅停机(Graceful Shutdown)](#3. 优雅停机(Graceful Shutdown))
[4. 其他生产要点](#4. 其他生产要点)
[十二、Spring Boot 4.x 新特性与迁移要点(2026 重点)](#十二、Spring Boot 4.x 新特性与迁移要点(2026 重点))
[1. Boot 4.0(2025-11-20 GA)关键变化](#1. Boot 4.0(2025-11-20 GA)关键变化)
[2. Boot 4.1(2026)增量](#2. Boot 4.1(2026)增量)
[3. 迁移步骤建议](#3. 迁移步骤建议)
[十三、高频面试 / 踩坑清单](#十三、高频面试 / 踩坑清单)
定位:Spring Boot 是 Spring 生态的"约定优于配置 "应用框架,目标是让 Spring 应用开箱即跑 ------内嵌 Web 容器、自动配置、起步依赖、生产级运维端点。 本文基于 2026 年主流版本:Spring Boot 3.5.x(最后的 3.x 维护线)与 4.0.x/4.1.x(当前新主线)。
一、版本与生态坐标
1. 当前版本格局(2026-10)
| 版本线 | 状态 | 基于 | Java 要求 |
|---|---|---|---|
| Boot 4.1.x(最新 4.1.1,2026-08) | 当前主线 GA | Spring Framework 7.1、Jakarta EE 11 | Java 17 起,原生支持 Java 25 |
| Boot 4.0.x(4.0.8) | 维护 | Spring Framework 7.0 | Java 17+ |
| Boot 3.5.x | 最后的 3.x 线(商业维护) | Spring Framework 6.2 | Java 17+ |
| Boot 2.7.x | 仅商业支持 | Framework 5.3 | Java 8+ |
⚠️ 新项目直接选 4.1.x + Java 17/21/25;维护老项目注意 2.x 已无开源支持。
2. 与 Spring Cloud 的版本对应(必须配套,不能乱搭)
| Spring Cloud 列车 | 别名 | 适配 Boot |
|---|---|---|
| 2025.1.x | Oakwood | 4.0.x / 4.1.x |
| 2025.0.x | Northfields | 3.5.x(OSS 已于 2026-06-30 终止) |
| 2024.0.x | Moorgate | 3.4.x |
| 2023.0.x | Leyton | 3.2.x / 3.3.x |
3. 三代技术栈关键差异
| 维度 | Boot 2.x | Boot 3.x | Boot 4.x |
|---|---|---|---|
| 包名 | javax.* |
jakarta.* |
jakarta.* |
| JDK | 8+ | 17+ | 17+(拥抱 25) |
| Framework | 5.x | 6.x | 7.x |
| JSON | Jackson 2 | Jackson 2 | Jackson 3(tools.jackson) |
| Web 容器 | Tomcat 9 | Tomcat 10 | Tomcat 11(Servlet 6.1) |
| 自动配置 | spring.factories | AutoConfiguration.imports | autoconfigure 进一步模块化拆分 |
二、快速开始
1. 创建项目
-
官方脚手架:https://start.spring.io/(选 Boot 版本、Java、依赖 starters)
-
国内可用阿里云镜像版;IDEA 的 Spring Initializr 同理。
2. 最小 pom 核心
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>4.1.1</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- Boot 4 也可用更精确的 spring-boot-starter-webmvc -->
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
起步依赖(starter)= 一组被预测试过的依赖组合 ,一个 spring-boot-starter-web 自动带入 spring-web、spring-webmvc、Tomcat、Jackson 等。
3. 启动类
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@SpringBootApplication 是三合一注解:
-
@SpringBootConfiguration:本质@Configuration,标记配置类; -
@EnableAutoConfiguration:开启自动配置(核心); -
@ComponentScan:扫描启动类所在包及子包。
启动类放在根包(如
com.example.demo),业务类放子包,保证默认扫描覆盖。
4. 推荐分层结构
com.example.demo
├── DemoApplication.java
├── controller/ // 接口层:参数校验、组装返回
├── service/ // 业务层(接口 + impl)
├── mapper/ 或 repository/ // 持久层
├── entity(domain)/ dto/ vo/
├── config/ // 自定义配置类
└── common/ // 统一返回、全局异常、工具
5. 运行方式
mvn spring-boot:run # 开发运行
mvn clean package # 打可执行 fat jar
java -jar target/demo-0.0.1.jar
三、核心原理:自动配置(面试与开发双重重点)
1. 自动配置要解决什么
传统 SSM 要手写大量 XML/Bean(数据源、事务管理器、MVC...)。Boot 的思路:classpath 上有什么类、用户配了什么属性,就自动装配什么 Bean,用户不配置也有合理默认值。
2. 工作机制
-
启动时
@EnableAutoConfiguration导入自动配置类清单; -
Boot 2.7 以前清单在
META-INF/spring.factories; 2.7 起(含 3.x/4.x)在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,每行一个自动配置类全限定名; -
每个自动配置类由条件注解决定是否生效;
-
配置值通过
@ConfigurationProperties从配置文件绑定。
3. 常用条件注解
| 注解 | 生效条件 |
|---|---|
@ConditionalOnClass |
classpath 存在指定类 |
@ConditionalOnMissingClass |
不存在指定类 |
@ConditionalOnBean |
容器中存在指定 Bean |
@ConditionalOnMissingBean |
容器中不存在该 Bean(用户可覆盖默认) |
@ConditionalOnProperty |
配置项满足条件,如 matchIfMissing |
@ConditionalOnWebApplication |
是 Web 环境 |
@ConditionalOnNotWebApplication |
非 Web 环境 |
4. 一个典型自动配置类长什么样(会读即可)
@AutoConfiguration
@ConditionalOnClass(HelloService.class)
@EnableConfigurationProperties(HelloProperties.class)
public class HelloAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public HelloService helloService(HelloProperties props) {
return new HelloService(props.getPrefix());
}
}
用户只要自己声明一个 HelloService Bean,@ConditionalOnMissingBean 就让默认配置退让------这就是"约定可被覆盖"。
5. 属性绑定
@Component
@ConfigurationProperties(prefix = "app.hello")
public class HelloProperties {
private String prefix = "Hi"; // 默认值
// getter/setter(或用 record 直接绑定)
}
app:
hello:
prefix: "你好"
-
松散绑定(Relaxed Binding) :
user-name/userName/user_name/USER_NAME都能绑定到userName; -
配合
spring-boot-configuration-processor,IDEA 写 yml 有提示; -
可用 JSR-380 注解(
@NotBlank等)+@Validated校验配置。
四、IoC 与常用注解速查
| 注解 | 用途 |
|---|---|
@Component / @Service / @Repository / @Controller |
通用组件 / 业务层 / 持久层(带持久异常转换)/ 控制层 |
@Configuration |
配置类,内部 @Bean 方法默认 CGLIB 代理,方法间调用拿的是同一个单例 |
@Bean |
把方法返回值交给容器 |
@Autowired |
按类型注入;构造器注入可省略(单构造器),推荐构造器注入(便于测试、不可变) |
@Qualifier |
同类型多 Bean 时按名称指定 |
@Resource(JDK/Jakarta) |
按名称注入 |
@Value |
注入单个配置值(复杂配置用 @ConfigurationProperties) |
@Lazy |
延迟初始化 |
@Profile("dev") |
按环境装配 |
五、Web 开发(spring-boot-starter-web,基于 Spring MVC)
1. 常用 Controller 注解
@RestController // = @Controller + @ResponseBody,直接返回 JSON
@RequestMapping("/api/users")
public class UserController {
@GetMapping("/{id}")
public UserVO get(@PathVariable Long id) { ... }
@PostMapping
public UserVO create(@Valid @RequestBody UserCreateDTO dto) { ... }
@PutMapping("/{id}")
public UserVO update(@PathVariable Long id, @Valid @RequestBody UserUpdateDTO dto) { ... }
@DeleteMapping("/{id}")
public void delete(@PathVariable Long id) { ... }
@GetMapping
public Page<UserVO> page(@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "20") int size) { ... }
}
- 注意 Boot 3/4 校验注解包名为
jakarta.validation;@Valid触发校验,分组校验用@Validated(Group.class)。
2. 参数校验(Bean Validation)
public class UserCreateDTO {
@NotBlank(message = "用户名不能为空")
@Size(min = 2, max = 20)
private String name;
@NotNull
@Min(0) @Max(150)
private Integer age;
@Email
private String email;
}
3. 统一返回格式
public record R<T>(int code, String message, T data) {
public static <T> R<T> ok(T data) { return new R<>(0, "ok", data); }
public static <T> R<T> fail(int code, String msg) { return new R<>(code, msg, null); }
}
4. 全局异常处理(@RestControllerAdvice)
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public R<Void> handleValid(MethodArgumentNotValidException e) {
String msg = e.getBindingResult().getFieldErrors().stream()
.map(f -> f.getField() + ":" + f.getDefaultMessage())
.collect(Collectors.joining(";"));
return R.fail(400, msg);
}
@ExceptionHandler(BusinessException.class)
public R<Void> handleBiz(BusinessException e) {
return R.fail(e.getCode(), e.getMessage());
}
@ExceptionHandler(Exception.class)
public R<Void> handleAll(Exception e) {
return R.fail(500, "系统异常");
}
}
生产环境不要把异常堆栈/内部信息直接返回前端,记日志即可。
5. 拦截器与过滤器
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) {
// 登录/鉴权逻辑,返回 false 中断
return true;
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
private final AuthInterceptor authInterceptor;
public WebConfig(AuthInterceptor authInterceptor) { this.authInterceptor = authInterceptor; }
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authInterceptor)
.addPathPatterns("/api/**")
.excludePathPatterns("/api/login");
}
}
-
过滤器(
Filter,Servlet 层)适合编码、跨域等通用处理;拦截器(Spring MVC 层)能拿到 handler 方法信息,适合业务鉴权。 -
跨域推荐
CorsConfiguration或网关统一处理,不要在业务里散落。
6. HTTP 客户端(调外部服务)
| 客户端 | 状态 | 说明 |
|---|---|---|
| RestClient | 当前首选(同步、流畅 API) | Framework 6.1 引入;Boot 4 有独立 spring-boot-starter-restclient |
| Http Interface | 推荐 | 声明式接口(类似 OpenFeign 但不依赖 Cloud),底层可配 RestClient/WebClient |
| WebClient | 响应式 | spring-webflux,非阻塞 |
| RestTemplate | 已进入弃用通道(Framework 7.x) | 老项目可用,新项目别再用 |
RestClient 示例:
RestClient client = RestClient.create("https://api.example.com");
UserDTO user = client.get()
.uri("/users/{id}", 1)
.retrieve()
.body(UserDTO.class);
Http Interface 示例:
public interface UserApiClient {
@GetExchange("/users/{id}")
UserDTO getUser(@PathVariable("id") Long id);
}
@Configuration
public class ClientConfig {
@Bean
UserApiClient userApiClient(RestClient.Builder builder) {
RestClient client = builder.baseUrl("https://api.example.com").build();
return HttpServiceProxyFactory.builderFor(RestClientAdapter.create(client))
.build().createClient(UserApiClient.class);
}
}
Boot 中调微服务 + 负载均衡,用 Spring Cloud OpenFeign(见 Cloud 笔记);调外部三方,用 RestClient/Http Interface。
六、配置管理
1. 配置文件
-
application.properties或application.yml(推荐,层级清晰); -
多环境:
application-dev.yml、application-prod.yml,通过spring.profiles.active=dev激活。
server:
port: 8080
servlet:
context-path: /demo
spring:
application:
name: demo-service
datasource:
url: jdbc:mysql://localhost:3306/demo
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: false
2. 外部化配置优先级(高 → 低,常考)
-
命令行参数
java -jar app.jar --server.port=9090; -
SPRING_APPLICATION_JSON; -
ServletConfig/ServletContext 参数;
-
JNDI;
-
Java 系统属性(System.getProperties);
-
OS 环境变量 (如
SERVER_PORT,松散绑定); -
jar 包外的
application-{profile}.yml; -
jar 包内的
application-{profile}.yml; -
@PropertySource; -
默认值。
要点:离代码越远优先级越高;敏感信息(密码)用环境变量/配置中心/Secret,不写进仓库配置。
3. 随机值与占位符
app:
code: ${random.uuid}
port: ${SERVER_PORT:8080} # 冒号后默认值
##七、数据访问
1. 连接池:默认 HikariCP
-
Boot 默认数据源连接池是 HikariCP(快、轻);
-
常用调优:
maximum-pool-size、minimum-idle、connection-timeout、max-lifetime; -
池大小不是越大越好,经验起点:核数×2 + 有效磁盘数,按实际压测调整。
2. Spring Data JPA(starter-data-jpa)
@Entity
public class User {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByName(String name); // 方法名派生查询
@Query("select u from User u where u.age > :age")
List<User> findAdults(@Param("age") int age);
}
3. MyBatis / MyBatis-Plus(国内主流)
-
mybatis-spring-boot-starter(或 mybatis-plus-spring-boot3-starter,注意选 Boot3/4 对应版本); -
@Mapper接口 + XML/注解 SQL; -
分页插件、自动填充、代码生成是 MP 常用能力。
4. 事务管理
@Service
public class OrderService {
@Transactional(rollbackFor = Exception.class)
public void createOrder(OrderDTO dto) {
// 多表写操作
}
}
要点(高频踩坑):
-
默认只回滚 RuntimeException/Error ,受检异常不回滚------建议显式
rollbackFor = Exception.class; -
@Transactional加在 public 方法 上,且必须经 Spring 代理调用才生效 :同类内部this.xxx()自调用事务不生效; -
传播行为默认
REQUIRED;REQUIRES_NEW挂起当前事务开新事务; -
事务方法内别做远程调用/耗时 IO;注意异常被 catch 吞掉导致不回滚;
-
readOnly=true可用于纯查询优化。
5. 多数据源
-
简单场景:用
@ConfigurationProperties配两个 DataSource + 分包扫描 + 各自事务管理器; -
复杂场景考虑动态路由数据源(如 AbstractRoutingDataSource)或 ShardingSphere(分库分表)。
八、日志
-
默认日志门面 SLF4J + 实现 Logback;默认级别 INFO;
-
常用级别:ERROR > WARN > INFO > DEBUG > TRACE;
-
用 Lombok 的
@Slf4j或手动LoggerFactory.getLogger(...);
logging:
level:
root: INFO
com.example.demo: DEBUG
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
file:
name: logs/app.log
- 结构化日志(JSON):Boot 3.4+ 内置支持,2026 年云原生标配,便于 ELK/Loki 采集:
logging:
structured:
format:
console: json
- 生产建议:日志输出到标准输出由容器采集;用 MDC 打 traceId;不打印密码/身份证等敏感信息。
九、生产级特性(Spring Boot 的"生产就绪"能力)
这部分是 Boot 自身能力,不要与 Spring Cloud 的微服务能力混淆。
1. Spring Boot Actuator(运维端点)
引入:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
常用端点:
| 端点 | 作用 |
|---|---|
/actuator/health |
健康检查(K8s liveness/readiness 探针对接) |
/actuator/info |
应用信息 |
/actuator/metrics |
指标 |
/actuator/loggers |
动态查看/修改日志级别(POST) |
/actuator/env |
环境配置(敏感,生产慎开) |
/actuator/beans /mappings /configprops |
Bean、URL 映射、配置属性(排障用) |
/actuator/prometheus |
Prometheus 指标暴露 |
暴露配置(生产只开必要端点):
management:
endpoints:
web:
exposure:
include: health,info,prometheus
endpoint:
health:
show-details: when_authorized
2. Micrometer 指标体系
-
Micrometer 是"SLF4J of metrics",Boot 内置;可对接 Prometheus、Datadog 等;
-
内置 JVM、Tomcat、数据源、HTTP 请求等指标;可自定义:
@Service
public class OrderService {
private final Counter orderCounter;
public OrderService(MeterRegistry registry) {
this.orderCounter = registry.counter("orders.created.total");
}
}
3. 优雅停机(Graceful Shutdown)
server:
shutdown: graceful
spring:
lifecycle:
timeout-per-shutdown-phase: 30s
收到 SIGTERM 后不再接新请求、等待存量请求处理完,配合 K8s terminationGracePeriodSeconds 使用。
4. 其他生产要点
-
健康组(groups) :
liveness/readiness分开对接 K8s 两种探针; -
虚拟线程(Virtual Threads):Boot 3.2+ 支持,3.5/4.x 成熟,开启后 IO 密集型服务用轻量虚拟线程:
spring:
threads:
virtual:
enabled: true
注意:CPU 密集、使用 synchronized pin 旧问题(新版 JDK 已修复大部分)、ThreadLocal 泛滥、连接池仍是瓶颈。
十、测试
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
| 测试方式 | 注解/工具 | 用途 |
|---|---|---|
| 纯单元测试 | JUnit 5 + Mockito(@Mock/@InjectMocks) |
测 Service,mock 掉依赖,最快 |
| 切片测试 | @WebMvcTest(UserController.class) |
只起 MVC 层,配 MockMvc |
| 切片测试 | @DataJpaTest |
只测 JPA(默认内嵌库) |
| 全集成测试 | @SpringBootTest + @AutoConfigureMockMvc |
起完整容器,慢但真实 |
| Web 断言 | MockMvc | 对接口状态码/JSON 断言 |
| Boot 4 新增 | RestTestClient | 统一的服务端测试客户端,可替代 TestRestTemplate |
@WebMvcTest(UserController.class)
class UserControllerTest {
@Autowired MockMvc mvc;
@MockBean UserService userService; // Boot 3.4+ 也可用 @MockitoBean
@Test
void should_get_user() throws Exception {
given(userService.getById(1L)).willReturn(new User(1L, "Tom"));
mvc.perform(get("/api/users/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.data.name").value("Tom"));
}
}
十一、打包与部署
-
可执行 fat jar :
mvn package,所有依赖打进 BOOT-INF,java -jar即跑; -
分层 jar(Layered Jar) :依赖层与应用层分开,变更应用代码不击穿 Docker 缓存,
layertools extract配合分层 Dockerfile; -
云原生构建 :
spring-boot:build-image直接用 Cloud Native Buildpacks 生成优化过的镜像(无需 Dockerfile); -
GraalVM Native Image :
spring-boot-starter+ native profile,编译成原生可执行文件,毫秒启动、低内存,代价是构建慢、反射/动态代理需显式 hint; -
CRaC(CRaC 4):JVM 检查点恢复,冷启动恢复到毫秒级。
最小 Dockerfile(多阶段,分层思路):
FROM eclipse-temurin:21-jre
WORKDIR /app
COPY target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
十二、Spring Boot 4.x 新特性与迁移要点(2026 重点)
1. Boot 4.0(2025-11-20 GA)关键变化
-
Spring Framework 7.0 + Java 17 基线,原生支持 Java 25;
-
Jakarta EE 11:Servlet 6.1、JPA 3.2、Bean Validation 3.1;Tomcat 11;Undertow 因未适配 Servlet 6.1 暂不支持;
-
Jackson 3 :包名从
com.fasterxml.jackson迁到tools.jackson;推荐JsonMapper(不可变);默认日期输出为 ISO-8601、属性默认按字母序;可与 Jackson 2 共存过渡; -
代码库完全模块化 :单体
spring-boot-autoconfigure拆成技术域小 jar(如spring-boot-starter-webmvc、spring-boot-starter-webmvc-test),体积更小、自动补全更干净; -
新增独立客户端 starter:
spring-boot-starter-restclient、spring-boot-starter-webclient; -
全组合 JSpecify 空安全 (
@Nullable/@NonNull,支持泛型/数组/vararg),Kotlin 2.2 自动翻译为空安全类型; -
API 版本化一等支持:header/path/query/媒体类型策略 + 弃用符合 RFC 9745;
-
弹性能力下沉内核:
@Retryable(含响应式、指数退避、抖动)、@ConcurrencyLimit(配合虚拟线程); -
新增 RestTestClient 、HTTP Interface Groups;流畅 JmsClient;Gradle 9 支持。
2. Boot 4.1(2026)增量
- Spring gRPC 支持、Log4j OpenTelemetry 文件轮转与增强、MongoDB 支持 Spring Batch、RabbitMQ Streams SSL、AMQP 1.0 等。
3. 迁移步骤建议
-
先在 Boot 3.5 + JDK 17/21 跑通,全部替换
javax → jakarta(2.7 迁移指南可分两步走); -
清理 deprecated API(spring.factories 自动配置、旧配置属性);
-
升 Boot 4:处理 Jackson 3 包名与默认行为、新模块坐标、JSpecify 下的空指针契约;
-
配套 Spring Cloud 升到 2025.1.x;用依赖分析与集成测试兜底。
十三、高频面试 / 踩坑清单
-
自动配置原理 :AutoConfiguration.imports +
@Conditional系列 +@ConfigurationProperties;如何排除(@SpringBootApplication(exclude=...)/spring.autoconfigure.exclude)。 -
Bean 生命周期 :实例化 → 属性填充 → Aware 回调 → BeanPostProcessor 前置 →
@PostConstruct/InitializingBean/init-method → BeanPostProcessor 后置(AOP 代理在此产生)→ 使用 →@PreDestroy/DisposableBean。 -
循环依赖 :三级缓存(singletonObjects / earlySingletonObjects / singletonFactories);构造器循环依赖无法解决 ,Boot 2.6+ 默认禁止循环依赖(
spring.main.allow-circular-references)。 -
事务失效场景:自调用、非 public、异常被吞、rollbackFor 未配、类未被 Spring 管理、数据库引擎不支持、传播级别配错。
-
过滤器 vs 拦截器 vs AOP:Servlet 层 / MVC 层 / 方法切面,各自适用面。
-
配置不生效:profile 没激活、同名前缀冲突、位置不对、被高优先级外部配置覆盖。
-
启动慢排查:组件扫描范围、自动配置过多、初始化阻塞;可用 Actuator startup 端点看初始化耗时。
-
内嵌容器切换:排除 Tomcat 换 Jetty(4.0 时代 Undertow 暂不可用)。
参考资料
-
Spring Boot 官方文档 --- Spring Boot :: Spring Boot
-
Spring Boot 4.0.0 available now(2025-11-20)--- Spring Boot 4.0.0 available now
-
Spring Framework 7.0 GA(2025-11-13)--- Spring Framework 7.0 General Availability
-
The state of HTTP clients in Spring(2025-09-30)--- The state of HTTP clients in Spring
-
InfoQ:Spring Framework 7 and Spring Boot 4(2025-11)--- https://www.infoq.com/news/2025/11/spring-7-spring-boot-4/
-
Next level Kotlin support in Spring Boot 4 --- Next level Kotlin support in Spring Boot 4