1. 概述
Spring Boot 为 Spring 生态系统提供了一套约定优于配置的解决方案。自2014年首次发布以来,Spring Boot 经历了持续演进和改进。其 2.0 版本于2018年初正式发布。
这个流行框架主要在以下领域提供支持:
- 依赖管理:通过 starter 和各种包管理器集成
- 自动配置:最小化 Spring 应用的配置量,遵循约定优于配置原则
- 生产就绪特性:如 Actuator、增强的日志、监控、指标以及各种 PaaS 集成
- 开发体验增强:提供多种测试工具,通过 spring-boot-devtools 实现更快的反馈循环
本文将探讨 Spring Boot 2.0 的主要变化和新特性,并说明这些特性如何提升我们的开发效率。
2. 依赖管理
2.1. Java 基线要求
Spring Boot 2.x 不再支持 Java 7 及以下版本,最低要求为 Java 8。
同时,这是首个支持 Java 9 的版本。1.x 分支没有支持 Java 9 的计划。这意味着如果你想使用最新 Java 版本并利用该框架,Spring Boot 2.x 是唯一选择。
2.2. 材料清单 (BOM)
随着每次新版本发布,Spring Boot 会升级 Java 生态中各种依赖的版本。这些定义在 Boot 的材料清单(BOM)中。
2.x 版本也不例外。无需列出所有依赖,我们可以查看spring-boot-dependencies.pom来了解任意时间点使用的具体版本。
关键最低版本要求:
- Tomcat 最低支持版本:8.5
- Hibernate 最低支持版本:5.2
- Gradle 最低支持版本:3.4
2.3. Gradle 插件改进
Gradle 插件经历了重大改进和一些破坏性变更。
构建 fat jar 时,bootRepackage 任务被替换为 bootJar 和 bootWar,分别用于构建 jar 和 war 包。
在 1.x 中,我们可以通过 gradle bootRun
运行应用。在 2.x 中,bootRun 继承了 Gradle 的 JavaExec。这意味着我们可以像配置传统 JavaExec 任务一样轻松配置它。
有时我们想利用 Spring Boot BOM,但又不想构建完整的 Boot 应用或重新打包。
值得注意的是,Spring Boot 2.x 默认不再应用依赖管理插件。
如果需要 Spring Boot 依赖管理,应添加:
apply plugin: 'io.spring.dependency-management'
这为上述场景提供了更大的灵活性和更少的配置。
3. 自动配置
3.1. 安全配置简化
在 2.x 中,安全配置被大幅简化。默认情况下所有资源都被保护,包括静态资源和 Actuator 接口。
一旦用户显式配置安全,Spring Boot 的默认设置将停止生效。用户可以在单一位置配置所有访问规则。
这避免了我们与 WebSecurityConfigurerAdapter 排序问题作斗争。这些问题通常发生在自定义配置 Actuator 和应用安全规则时。
看一个混合了 Actuator 和应用规则的简单安全配置片段:
http.authorizeRequests()
.requestMatchers(EndpointRequest.to("health"))
.permitAll() // 按接口配置的 Actuator 规则
.requestMatchers(EndpointRequest.toAnyEndpoint())
.hasRole("admin") // Actuator 通用规则
.requestMatchers(PathRequest.toStaticResources().atCommonLocations())
.permitAll() // 静态资源安全
.antMatchers("/**")
.hasRole("user") // 应用安全规则
// ...
3.2. 响应式编程支持
Spring Boot 2 为不同的响应式模块引入了新的 starter。例如 WebFlux,以及 MongoDB、Cassandra 和 Redis 的响应式版本。
还提供了 WebFlux 的测试工具。特别是我们可以利用 @WebFluxTest。其行为类似于 1.4.0 引入的 @WebMvcTest,属于测试切片的一部分。
4. 生产就绪特性
Spring Boot 提供了创建生产级应用的实用工具,其中最突出的是 Spring Boot Actuator。
Actuator 包含简化监控、追踪和应用自省的各种工具。更多 Actuator 细节可参考我们之前的文章。
2.0 版本的 actuator 经历了重大改进。本次迭代专注于简化定制,并支持新的响应式模块等 Web 技术。
4.1. 技术支持扩展
在 Spring Boot 1.x 中,actuator 接口仅支持 Spring-MVC。但在 2.x 中,它变得独立且可插拔。Spring Boot 现在原生支持 WebFlux、Jersey 和 Spring-MVC。
与之前一样,JMX 仍然是一个选项,可通过配置启用或禁用。
4.2. 自定义接口创建
新的 actuator 基础设施与技术无关。因此,开发模型被彻底重新设计。
新模型还带来了更大的灵活性和表现力。
看如何为 actuator 创建一个 Fruits 接口:
@Endpoint(id = "fruits")
public class FruitsEndpoint {
@ReadOperation
public Map<String, Fruit> fruits() { ... }
@WriteOperation
public void addFruits(@Selector String name, Fruit fruit) { ... }
}
一旦在 ApplicationContext 中注册 FruitsEndpoint,就可以使用我们选择的技术将其暴露为 Web 接口。根据配置,也可以通过 JMX 暴露。
将接口转换为 Web 接口后,结果如下:
- GET /application/fruits 返回水果列表
- POST /applications/fruits/{a-fruit} 处理应包含在请求体中的水果
还有更多可能性。我们可以获取更细粒度的数据,也可以为底层技术(如 JMX vs Web)定义特定实现。为保持简洁,本文仅作简单介绍。
4.3. Actuator 安全机制
在 Spring Boot 1.x 中,Actuator 定义了自己的安全模型,与应用使用的模型不同。
当用户尝试细化安全配置时,这曾是许多痛点根源。
在 2.x 中,安全配置应与应用其余部分使用相同的配置。
默认情况下,大多数 actuator 接口被禁用。这与 Spring Security 是否在类路径中无关。除 status 和 info 外,所有其他接口都需要用户手动启用。
4.4. 其他重要变更
- 大多数配置属性现在位于 management.xxx 下,例如:management.endpoints.jmx
- 某些接口格式更新,例如:env、flyway 或 liquibase
- 预定义接口路径不再可配置
5. 开发体验增强
5.1. 更好的反馈机制
Spring Boot 在 1.3 中引入了 devtools。
它解决了典型的开发问题,例如视图技术缓存、自动重启和浏览器实时重载,还支持远程调试应用。
在 2.x 中,当应用被 devtools 重启时,会打印出"增量"报告。该报告会指出变更内容及其对应用的潜在影响。
假设我们定义了一个 JDBC Datasource 来覆盖 Spring Boot 配置的数据源。
Devtools 会提示自动配置的数据源不再创建,并指出原因:javax.sql.DataSource 类型的 @ConditionalOnMissingBean 不匹配条件。Devtools 会在重启后打印此报告。
5.2. 破坏性变更
由于 JDK 9 的问题,devtools 移除了通过 HTTP 进行远程调试的支持。
6. 总结
本文介绍了 Spring Boot 2 的主要变化:
✅ 依赖管理:Java 8 成为最低支持版本
✅ 自动配置:安全配置大幅简化
✅ 生产特性:Actuator 实现技术无关性和更灵活的定制
⚠️ 开发工具:devtools 提供更详细的变更反馈,但移除了 HTTP 远程调试
这些改进共同提升了开发效率和应用可维护性,使 Spring Boot 2 成为构建现代 Java 应用的强大基础。