版本变更:
1、@SpringBootTest 属性源优先级:使用 @SpringBootTest
注解的测试现在将命令行属性源置于测试属性源之上
在 Spring Boot 2.7 及更高版本中,对 @SpringBootTest
的属性源优先级进行了调整,使得通过命令行传递的属性(args
)现在具有比通过 @TestPropertySource
或 @Properties
注解指定的属性更高的优先级。
这意味着,如果存在同名的属性,命令行属性将覆盖通过注解指定的属性。
示例:
java
@SpringBootTest(properties = "app.name=MyApp")
public class MyTests {
@Test
public void testAppName() {
String appName = EnvironmentTestUtils.getEnvironment().getProperty("app.name");
assertEquals("MyAppFromCommandLine", appName);
}
}
如果在运行测试时,通过命令行指定了 --
app.name=MyAppFromCommandLine
,则 testAppName
测试方法中的断言将通过,因为命令行属性 MyAppFromCommandLine
将覆盖 @SpringBootTest
注解中指定的属性。
这个变化使得测试环境更加灵活,允许开发者在不修改测试代码的情况下,通过命令行参数来覆盖测试环境中的配置属性。这对于需要根据不同环境(如不同的 CI/CD 阶段或本地开发环境)调整测试配置的情况非常有用。
2、Flyway 模块更新:升级到 Flyway 8.5,并引入了针对不同数据库的新模块
在 Spring Boot 2.7 版本中,对 Flyway 进行了重要的更新,升级到了 Flyway 8.5 版本。这个版本带来了一些重大变化,特别是对于数据库的支持被分割成了针对不同数据库的新模块。这种模块化的做法旨在提供更清晰、更灵活的依赖管理,并且使得 Flyway 能够更好地支持各种数据库系统。
主要变化
-
新模块引入: Flyway 8.5 将对不同数据库的支持分割成了独立的模块。如果你的项目中使用了 Flyway 来管理数据库迁移,并且针对特定的数据库(如 MySQL、PostgreSQL 等),你需要在项目的依赖管理文件中明确指定这些新模块。
例如,如果你使用的是 MySQL,你需要添加如下依赖:
XML<dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-mysql</artifactId> <version>8.5</version> </dependency>
-
模块化的优势:
- 更细粒度的控制:开发者可以只包含他们需要的数据库模块,这有助于减少最终应用程序的体积。
- 更好的维护:每个数据库模块可以独立更新和维护,使得 Flyway 团队能够更快速地响应特定数据库的变化。
- 清晰的依赖关系:通过明确指定所需的数据库模块,项目的依赖关系变得更加清晰,减少了潜在的冲突和不一致。
3、H2 数据库升级:升级到 H2 2.1.120 版本,该版本与旧版本不兼容,并修复了一些安全漏洞
4、jOOQ:没有开源版本的 jOOQ 同时兼容 Java 8 和 H2 2.x,如果使用 Java 11,建议升级到 jOOQ 3.16 或更高版本
jOOQ 是一个轻量级的 Java ORM(对象关系映射)框架,可用来构建复杂的 SQL 查询。
5、Microsoft SQL Server JDBC 驱动程序 10:升级 MSSQL 驱动程序到 v10,新驱动程序默认启用加密
升级到 MSSQL 驱动程序 v10 带来了以下主要变化:
-
默认启用加密:新驱动程序默认启用了 TLS 加密,这意味着所有通过这个驱动程序建立的数据库连接都将使用加密连接。这是一个重要的安全增强,可以保护数据在客户端和服务器之间传输过程中的安全性。如果你的应用之前依赖于未加密的连接,这可能需要你更新应用的配置,以确保它能够正确地使用加密连接。
-
证书验证:当
encrypt
设置为false
但服务器要求加密时,将根据trustServerCertificate
连接设置验证证书。这确保了即使在非加密模式下,也能对服务器的证书进行验证,增加了一层安全保障。 -
连接属性的变更:一些连接属性已经被弃用,例如
aadSecurePrincipalId
和aadSecurePrincipalSecret
。推荐使用用户名和密码代替这些属性进行身份验证。 -
API 的变更:出于安全考虑,一些 API 被移除,例如
getAADSecretPrincipalId
API。这些变更可能需要你更新应用代码,以确保与新版本的驱动程序兼容。 -
支持新的 Java 版本:JDBC 驱动程序现在支持 Java 17,除了之前的 JDK 11 和 JDK 8。这为使用最新 Java 版本的开发者提供了更好的支持。
-
其他改进和修复:新版本的驱动程序还包含其他一些改进和修复,例如提高了从 SQL Server 检索临时数据类型时的性能,支持具有安全 Enclave 的 Always Encrypted 功能,以及改进了 Azure Active Directory 身份验证的支持。
6、OkHttp 4:由于 OkHttp 3 不再维护,Spring Boot 2.7 升级到 OkHttp 4
7、netty-tcnative 分离依赖管理:移除了对 netty-tcnative 的单独依赖管理
8、Spring Data MongoDB 嵌入式功能配置属性移除:移除了 spring.mongodb.embedded.features
配置属性
这个属性用于配置嵌入式 MongoDB 的特定功能。
嵌入式 MongoDB 是一个轻量级的 MongoDB 实例,它被用于测试,可以快速启动和停止。在 Spring Boot 应用中,它通常用于测试而不需要一个完整的 MongoDB 服务器。在旧版本中,spring.mongodb.embedded.features
属性允许你指定要启用的嵌入式 MongoDB 的特性。
9、Servlet-specific Mustache 属性:一些特定于 Servlet 的 Mustache 属性已被弃用,并引入了替代属性
Mustache是一个无逻辑的模板引擎,用于创建动态HTML内容。它由{{}}包围的标签名称组成,不支持if-else语句和for循环等逻辑操作。Mustache的Java API可以用于生成动态内容,并且可以作为Maven依赖项添加到项目中。
以下是一些被弃用和替代的属性:
- spring.mustache.allow-request-override - 被替换为 spring.mustache.servlet.allow-request-override
- spring.mustache.allow-session-override - 被替换为 spring.mustache.servlet.allow-session-override
- spring.mustache.cache - 被替换为 spring.mustache.servlet.cache
- spring.mustache.content-type - 被替换为 spring.mustache.servlet.content-type
- spring.mustache.expose-request-attributes - 被替换为 spring.mustache.servlet.expose-request-attributes
- spring.mustache.expose-session-attributes - 被替换为 spring.mustache.servlet.expose-session-attributes
- spring.mustache.expose-spring-macro-helpers - 被替换为 spring.mustache.servlet.expose-spring-macro-helpers
10、ReactiveElasticsearchTemplate 默认索引选项:更改了自动配置的 ReactiveElasticsearchTemplate
的默认索引选项
ReactiveElasticsearchTemplate是Spring Data Elasticsearch提供的一个响应式的Elasticsearch操作模板,用于检索命中和聚合数据。它基于Reactive Streams和Elasticsearch的Reactive REST客户端实现,可以方便地进行异步、非阻塞的数据操作。
使用ReactiveElasticsearchTemplate检索命中和聚合的步骤如下:
- 引入依赖:在项目的构建文件中添加Spring Data Elasticsearch和Elasticsearch的依赖。
- 配置连接:在应用的配置文件中配置Elasticsearch的连接信息,包括主机地址、端口号、索引名称等。
- 创建Elasticsearch实体类:根据需要检索和聚合的数据结构,在Java代码中创建对应的Elasticsearch实体类,并使用注解标记字段与Elasticsearch索引的映射关系。
- 创建ReactiveElasticsearchTemplate:在需要使用ReactiveElasticsearchTemplate的类中,通过注入的方式创建ReactiveElasticsearchTemplate对象。
- 编写查询和聚合操作:使用ReactiveElasticsearchTemplate提供的方法,结合Elasticsearch的查询语法和聚合语法,编写检索命中和聚合的操作。
- 执行操作并处理结果:调用ReactiveElasticsearchTemplate的方法执行操作,并通过响应式编程的方式处理返回的结果流。可以使用操作符进行数据转换、过滤、排序等操作,最终得到符合需求的结果。
ReactiveElasticsearchTemplate的优势在于它提供了响应式的操作方式,能够更好地适应高并发、大数据量的场景。它还提供了丰富的查询和聚合操作方法,可以满足各种复杂的数据检索和分析需求。
ReactiveElasticsearchTemplate的应用场景包括但不限于:
- 实时日志分析:通过实时检索和聚合Elasticsearch中的日志数据,进行实时监控和分析。
- 数据可视化:将Elasticsearch中的数据进行可视化展示,例如生成图表、仪表盘等。
- 搜索引擎:构建全文搜索引擎,支持关键词搜索、过滤、排序等功能。
- 推荐系统:基于用户行为和兴趣偏好,使用ReactiveElasticsearchTemplate进行数据检索和聚合,实现个性化推荐。
11、MongoDB 属性优先级:spring.data.mongodb.uri
属性现在优先于其他单独的属性
12、在 Maven 进程中运行应用程序:spring-boot:run
和 spring-boot:start
Maven 插件目标默认在 forked 进程中运行应用程序,禁用此行为的 fork
属性已被弃用
13、有序退出代码生成器:ExitCodeGenerators
现在根据它们的 Ordered
实现和 @Order
注解进行排序。
14、度量标签键重命名:将 camelCase 风格的度量标签键重命名为符合 Micrometer 推荐的全小写和使用点分隔的风格
15、从 Spring Security 5.7 开始,弃用了 WebSecurityConfigurerAdapter
从 Spring Security 5.7 开始,WebSecurityConfigurerAdapter
已经被弃用。这是 Spring Security 项目为了进一步简化安全性配置而做出的变更。在 Spring Security 5.7 及更高版本中,推荐使用基于 Java 的配置方式,而不是继承 WebSecurityConfigurerAdapter
。
弃用原因:
WebSecurityConfigurerAdapter
需要在配置类中重写多个方法,这增加了配置的复杂性
新的配置方式旨在简化安全性设置,使其更加直观和易于理解
推荐的替代方案:
使用 SecurityFilterChain
Bean 来配置安全性。这种方式允许你直接在 Spring 配置中声明安全性规则,而不是通过重写方法
对于不需要自定义过滤器链的场景,可以使用 HttpSecurity
Bean 来配置安全性
示例配置:
1、使用 SecurityFilterChain
Bean
java
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests(authorizeRequests ->
authorizeRequests
.antMatchers("/public/**").permitAll()
.anyRequest().authenticated()
)
.httpBasic(withDefaults());
return http.build();
}
}
2、使用 HttpSecurity
Bean
java
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Autowired
public void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests(authorizeRequests ->
authorizeRequests
.antMatchers("/public/**").permitAll()
.anyRequest().authenticated()
)
.httpBasic(withDefaults());
}
}
新特性
1、Spring GraphQL 启动器:引入了新的 spring-boot-starter-graphql
启动器。
2、RabbitStreamTemplate 支持:如果设置了 spring.rabbitmq.stream.name
属性,将自动配置 RabbitStreamTemplate
。
3、Hazelcast @SpringAware 支持:自动配置的 Hazelcast 嵌入式服务器现在默认使用 SpringManagerContext
。
4、操作系统信息在 Info 端点:可以公开有关操作系统的信息。
5、Java 供应商信息在 Info 端点:改进了现有的 JavaInfoContributor
,提供了一个专用的部分用于供应商信息。
6、在 RSocket 处理方法中访问经过身份验证的主体:RSocket 处理方法现在可以注入 @Authenticated Principal
。
7、无需 OIDC SDK 即可进行不透明令牌内省:如果使用不透明令牌内省在 OAuth2 资源服务器中,自动配置的内省器不再需要依赖 com.nimbusds:oauth2-oidc-sdk
。
8、@DataCouchbaseTest 和 @DataElasticsearchTest:引入了用于测试使用 Spring Data Couchbase 和 Spring Data Elasticsearch 的应用程序的新的测试注解。
这些注解专门设计用于测试环境,它们提供了一种快速且高效的方式来配置和初始化这些 NoSQL 数据库的测试实例。
1、@DataCouchbaseTest
这个注解自动配置了 Spring Data Couchbase 的测试环境,允许开发者编写针对 Couchbase 数据库的集成测试。
它通常与 @Document
注解一起使用,后者用于标识与 Couchbase 数据库交互的实体类。
2、@DataElasticsearchTest
这个注解自动配置了 Spring Data Elasticsearch 的测试环境,使得开发者可以轻松编写和执行针对 Elasticsearch 的集成测试。
它与 @Document
注解协同工作,后者定义了映射到 Elasticsearch 索引的实体类。
这些注解的引入,不仅简化了测试配置,还提高了测试的可读性和维护性。开发者可以通过简单地添加这些注解来启用对相应数据库的测试支持,而无需手动编写大量的配置代码。
示例:
@DataElasticsearchTest
的测试类如下所示:
java
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.query.Query;
import org.springframework.data.elasticsearch.core.query.QueryResults;
import org.springframework.data.elasticsearch.core.mapping.ElasticsearchMappingContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.test.context.ActiveProfiles;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
// 指定这是一个使用 Elasticsearch 的测试
@DataElasticsearchTest
// 告诉 Spring Boot 测试框架使用哪个配置文件
@ActiveProfiles("test")
public class ElasticsearchTests {
@Autowired
private ElasticsearchRestTemplate elasticsearchTemplate;
@Autowired
private ElasticsearchMappingContext mappingContext;
@Autowired
private YourElasticsearchRepository yourRepository; // 注入你的 Elasticsearch 仓库
@Document(indexName = "your_index")
public static class YourDocument {
private String id;
private String content;
// getters and setters
}
public interface YourElasticsearchRepository extends ElasticsearchRepository<YourDocument, String> {
// 可以添加自定义查询方法
}
@Test
public void testSaveAndFind() throws Exception {
YourDocument document = new YourDocument();
document.setId("1");
document.setContent("Hello Elasticsearch");
// 保存文档
elasticsearchTemplate.save(document);
// 验证文档是否被正确保存
Query query = new Query();
QueryResults<YourDocument> results = elasticsearchTemplate.search(query, YourDocument.class);
assertThat(results.getTotalHits()).isEqualTo(1);
assertThat(results.getContent().get(0).getId()).isEqualTo(document.getId());
}
}
在这个示例中:
@DataElasticsearchTest
注解被用于自动配置 Elasticsearch 测试环境。YourDocument
是一个简单的文档类,使用@Document
注解标记,表示它将被映射到 Elasticsearch 的索引中。YourElasticsearchRepository
是一个继承自ElasticsearchRepository
的接口,用于操作YourDocument
。- 在测试方法
testSaveAndFind
中,我们创建了一个YourDocument
实例,使用ElasticsearchRestTemplate
保存它,并验证它是否被正确索引。
依赖升级
Spring Boot 2.7 升级了多个 Spring 项目到新版本,包括 Spring Data 2021.2、Spring HATEOAS 1.5、Spring LDAP 2.4、Spring Security 5.7 和 Spring Session 2021.2。此外,还升级了许多第三方依赖。
其他变更
支持 Podman 作为构建镜像的容器引擎
添加了对 Cache2k 的依赖管理和自动配置
使用 PEM 编码证书简化了嵌入式 Web 服务器的 SSL 配置
弃用了 Elasticsearch 的 RestHighLevelClient 并推荐使用低级别的 RestClient
R2DBC 驱动程序变更,特别是 PostgreSQL 和 MySQL 驱动程序的变更