Spring Boot 2.0 迁移指南

前提

本文档将帮助您把应用程序迁移到 Spring Boot 2.0。

在你开始之前

首先,Spring Boot 2.0需要Java 8或更高版本。Java 6 和 7 不再受支持。

在 Spring Boot 2.0 中,许多配置属性被重新命名/删除,开发人员需要更新/ 相应的配置。为了帮助你,Spring Boot 发布了一个新模块。一旦作为依赖添加到项目中,这不仅将分析应用程序的环境并在启动时打印诊断信息,而且还会在运行时为您暂时迁移属性。这是您的应用程序迁移期间必须具备的条件:

注意:完成迁移后,请确保从项目的依赖关系中删除此模块。

构建您的 Spring Boot 应用程序

Spring Boot Maven 插件

如今暴露为属性的插件配置属性都以一个前缀开始,以保持一致性并避免与其他插件发生冲突。

例如,以下命令使用命令行启用配置文件

Surefire 默认值

自定义包含/排除模式已与最新的 Surefire 默认设置保持一致。如果您依赖我们的,请相应地更新您的插件配置。他们曾经如下:

PS: 如果您使用 JUnit 5,则应将 Surefire 降级到 。该版本不包含此模式,因此如果您依赖该模式,请确保将其添加到您的配置中。

Spring Boot Gradle 插件

Spring Boot 的 Gradle 插件在很大程度上已被重写,以实现许多重大改进。您可以在其参考文献和API文档中阅读关于插件功能的更多信息。

依赖管理

Spring Boot 的 Gradle 插件不再自动应用依赖管理插件。相反,Spring Boot 的插件现在可以通过导入正确版本的spring-boot-dependencies BOM 来应用依赖管理插件。这使您可以更好地控制配置依赖性管理的方式和时间。

对于大多数使用依赖管理插件的应用程序来说就足够了:

注意:依赖管理插件仍然是 spring-boot-gradle-plugin 的传递依赖项,所以不需要在 buildscript 配置中将其列为类路径依赖项。

建立可执行的 Jars 和 Wars

该任务已被替换,并分别建立可执行的 Jars 和 Wars 的任务。和任务不再参与。

配置更新

,和任务现在都使用的属性来配置主类的名称。这使得三个特定于引导的任务相互一致,并将其与 Gradle 自己的应用程序插件进行对齐。

Spring Boot 特性

默认代理策略

Spring Boot 默认使用 CGLIB 代理,包括 AOP 支持。如果你需要基于代理的代理,你需要设置为。

SpringApplicationWeb 环境

Spring Boot 应用程序现在可以在更多模式下运行,因此现在不推荐使用属性来支持更多的控制。

如果您想确保应用程序不启动 Web 服务器,则必须将该属性更改为:

注意:还有一个上,如果你想这样做编程。

Spring Boot 应用程序事件更改

我们已经添加了一个新事件。 在上下文刷新之后但在任何应用程序和命令行参数被调用之前发送。 在任何应用程序和命令行参数被调用后发送。它表示应用程序已准备好为请求提供服务。

请参阅更新的参考文档。

Banner

在我们限制 Spring Boot 使用的根名称空间的数量的过程中,与标志相关的属性已被重定位到。

外部化配置轻松的绑定

有关宽松绑定的规则已经收紧。我们假设一个现有的属性:

所有前缀必须是 kebab格式(小写,连字符分隔)或无效 - 您必须在此处使用。

属性名称可以使用 kebab-case(),camel-case()或 snake-case()。

环境属性(来自操作系统环境变量)必须使用通常的大写下划线格式,下划线只能用于分隔键的各个部分。

这种新的放松绑定具有以下几个优点:

无需担心密钥的结构:只要密钥是以规范格式定义的,支持的松散变体就可以透明地工作。如果您正在使用该属性,则现在只需使用或属性即可放置完整密钥。

不再可以自动处理:将找到一个属性。

该软件包不再可用,并被新的宽松绑定规则所取代。特别是,朋友已被新的API 取代。以下样品从前缀中进行绑定。

由于现在内置了轻松绑定,因此只要使用其中一种支持的格式,就可以请求任何属性而不必关心案例:

验证

如果您想打开验证,现在必须为您的对象添加注释。

配置位置

配置的行为已被修复; 它先前将一个位置添加到默认位置列表中,现在它将替换默认位置。如果你依靠之前处理的方式,现在应该使用它。

开发 Web 应用程序嵌入式容器包装结构

为了支持反应性用例,嵌入式容器包结构已经被非常广泛地重构。 已被重新命名为,并且该包已被重新定位到。例如,如果您使用回调接口定制嵌入式Tomcat容器,则应该使用。

特定于 Servlet 的服务器属性

许多 属性 ( Servlet 特有的) 已经转移到:

Web Starter 作为传递依赖

以前有几个 Spring Boot starter 是依赖于 Spring MVC 而传递的。借助 Spring WebFlux的新支持,并不再依赖它。开发者有责任选择和添加或。

模板引擎

Mustache 模板的默认文件扩展名是,它现在与官方规范和大多数IDE插件一致。您可以通过更改配置键来覆盖此新的默认值。

Jackson / JSON 支持

在 2.0 中,我们改变了 Jackson 配置默认值,将 JSR-310 日期写为 ISO-8601 字符串。如果你想回到以前的行为,你可以添加到你的配置。

新的 starter 收集必要的位以读取和写入 JSON。它不仅提供了,与Java8 工作时也是有用的模块:,和。以前您需要手动依赖这些模块,现在可以依靠这个新的 starter 。

Spring MVC 路径匹配默认行为更改

我们已决定在 Spring MVC 应用程序中更改后缀路径匹配的默认值(请参阅#11105)。按照 Spring Framework 中记录的最佳实践,此功能不再默认启用。

如果您的应用程序希望将请求映射到映射,则此更改会影响您。

有关此更多信息以及如何减轻此更改,请查阅Spring Boot中有关路径匹配和内容协商的参考文档。

Servlet 过滤器

Servlet 过滤器的默认调度程序类型现在是; 这使 Spring Boot 的默认值与 Servlet 规范的默认值一致。如果您希望将过滤器映射到其他调度程序类型,请使用注册您的过滤器。

注意:Spring Security 和 Spring Session 过滤器配置 , 以及 调度类型。

RestTemplateBuilder

该方法已被新方法所取代。允许构建器生成的每个模板使用它自己的请求工厂,从而避免共享工厂可能导致的副作用。见#11255。

WebJars 定位器

Spring Boot 1.x 使用并提供依赖关系管理。是一个“命名不佳的库……包装项目”。应该更新依赖项来代替使用。

Security

Spring Boot 2 极大地简化了默认的安全配置,并使添加定制安全变得简单。Spring Boot 现在具有一种行为,只要您添加自己的 就会退出,而不是进行多种与安全性相关的自动配置。

如果您使用以下任何属性,则会受到影响:

默认安全

安全自动配置不再公开选项,并尽可能使用 Spring Security 默认值。一个明显的副作用是使用 Spring Security 的内容协商进行授权(表单登录)。

默认用户

默认情况下,Spring Boot 使用生成的密码配置单个用户。用户可以使用 属性进行配置。要进一步定制用户或添加其他用户,您将不得不公开一个bean。

AuthenticationManager Bean

如果您想将 Spring Security 作为 bean 公开,请覆盖您的方法并为其添加注释。

OAuth2

从功能的 Spring Security OAuth 项目 迁移到核心 Spring Security。不再为依赖关系提供依赖管理,Spring Boot 2 通过 Spring Security 5 提供 OAuth 2.0 客户端支持。

如果您依赖尚未迁移的 Spring Security OAuth 功能,则需要在其他 jar 上添加依赖项,请查看文档以获取更多详细信息。我们还继续支持 Spring Boot 1.5,以便旧版应用程序可以继续使用它,直到提供升级路径。

执行器安全

执行器不再有单独的安全自动配置(属性消失)。每个端点的标志也没有在安全配置中变得更加明确。如果您依赖于此行为,则需要创建或调整您的安全配置,以保护您选择角色的端点。

例如,假设以下配置:

需要注意的是在,和在默认情况下启用(与默认情况下不显示其细节)。为了与这些新的默认值一致,已被添加到第一个匹配器。

使用 SQL 数据库配置数据源

默认连接池已从 Tomcat 切换到 HikariCP。如果您过去在基于 Tomcat 的应用程序中强制使用 Hikari,现在可以删除重写。

特别是,如果你有这样的设置:

现在可以这样修改:

WARN 消息隐含的'打开在视图'

从现在起,未明确启用的应用程序将在启动过程中收到警告消息。虽然这种行为是一种友好的默认行为,但如果您没有完全意识到为您做了什么,这可能会导致问题。此消息可确保您了解可在查看呈现期间执行数据库查询。如果你没有问题,你可以明确地配置这个属性来消除警告信息。

JPA 和 Spring Data

在 Spring Boot 1.x 中,一些用户正在扩展以将高级自定义应用于自动配置。为了防止发生这种错误的用例,Spring Boot 2 中不再可能扩展它。

为了支持这些用例,现在可以定义一个bean,它可以完全控制 Hibernate 属性,包括注册在上下文中声明为 bean 的 Hibernate 拦截器的能力。

Flyway

Flyway 配置键被移动到命名空间(即)

升级到 Spring Boot 2 将会将 Flyway 升级到。为确保模式升级顺利进行,请按照以下说明操作:

首先将您的Spring Boot 应用程序升级到 Flyway 4,请参阅Maven和Gradle的说明。

一旦您的架构升级到了 Flyway 4,升级到 Spring Boot 2 并再次运行迁移以将您的应用程序移植到 Flyway 5。

Liquibase

Liquibase 配置键被移动到命名空间(即)

数据库初始化

基本初始化现在仅针对嵌入式数据源启用,并将在您使用生产数据库时立即关闭。新的(替换)提供更多的控制。

更新默认的'创建 - 删除'处理

属性默认为只有在没有使用 Liquibase 或 Flyway 等模式管理器时才使用嵌入式数据库进行创建。一旦检测到模式管理器,默认更改为 。

整合 NoSQLRedis

现在使用的是 Lettuce 而不是 Jedis 作为 Redis 驱动程序。如果您使用更高级别的Spring Data 构造,则应该发现变化是透明的。我们仍然支持 Jedis,如果您愿意,通过排除 并添加 ,则可以自由切换依赖项。

Elasticsearch

Elasticsearch 已经升级到 6.0+。与 Elastic 宣布嵌入式 Elasticsearch 不再受支持一致,自动配置已被删除。可以通过使用提供要连接的一个或多个节点的地址来自动配置。

高速缓存

用于缓存的专用 Hazelcast 自动配置。

无法自动配置常规和专用缓存。因此,该属性已不再可用。

批量

在启动时执行批处理作业的 CommandLineRunner 的顺序为 0。

测试Mockito 1.x

Mockito 1.x 不再支持和。如果你不用来管理你的依赖关系,你应该升级到 Mockito 2.x.

Spring Boot Actuator

Spring Boot 2 为 Actuator 带来了重要变化,无论是内部还是面向用户,请查阅参考指南中的更新部分和新的Actuator API文档。

您应该期望编程模型,配置密钥和某些端点的响应格式发生变化。Actuator 现在在 Spring MVC,Spring WebFlux 和Jersey 上得到本地支持。

构建

Actuator 的代码分为两个模块:现有的和新的。如果您使用原始模块()导入执行器,请考虑使用启动器替代它。

Keys 的配置结构

Endpoints 基础配置 key 已经统一:

基本路径

所有 endpoints 默认情况下都已移至 。

我们修改了 的含义:它现在是 的端点管理等效物(只有在设置了 时才有效)。另外,您还可以使用新的单独属性为管理端点设置基本路径:。

例如,如果你设置和,你就可以在下面的路径到达终点健康:。

如果你想恢复 1.x 的行为(即具有代替),设置以下属性:

审计事件 API 更改

现在有一个包含所有可选参数的单一方法。

Endpoints

要通过 HTTP 使执行器端点可用,它需要同时启用公开。默认:

无论您的应用程序中是否存在和配置 Spring Security,只有端点和端点都是暴露的。

所有端点,但已启用。

您可以按如下方式公开所有端点:

您可以通过以下方式显式启用端点:

要公开所有(已启用)网络端点除端点之外:

Endpoint changes

端点属性已更改如下:

已经转移到了

没有替换(端点的 ID 不再可配置)

没有替代品(请参见执行器安全)

已经转移到了

端点格式端点大改变

JSON 格式已经更改为现在正确地包含有关上下文层次结构,多个部署的 Servlet 和 Servlet 过滤器的信息。详情请参阅#9979。

Actuator API 文档的相关部分提供了一个示例文档。

端点大改变

响应的结构已经过改进,以反映端点关注跟踪 HTTP 请求 - 响应交换的情况。

迁移自定义端点

如果您有自定义执行器端点,请查看专用博客文章。该团队还撰写了一个 wiki 页面,介绍如何将现有的执行器端点迁移到新的基础架构。

Metrics

Spring Boot自己的指标已被支持取代,包括自动配置,用于 icrometer 和 dimensional 指标。

设置 icrometer

如果您的 Spring Boot 2.0 应用程序已依赖于 Actuator,则 icrometer 已在此处并自动配置。如果您希望将度量标准导出到 Prometheus,Atlas 或 Datadog 等外部注册表,Micrometer 将为许多注册表提供依赖关系; 您可以使用属性配置您的应用程序以导出到特定的注册表。

迁移定制计数器/量表

您可以通过以下方式创建各种指标,而不是在应用程序代码中注入或实例化:

注入和调用方法。

直接调用静态方法。

开发者工具

热拔插

由于 Spring Loaded 项目已移至 attic,它在 Spring Boot 的支持已被删除。我们建议使用 Devtools。

Devtools 远程调试隧道

已经从 Devtools 中删除了对通过 HTTP 进行隧道远程调试的支持。

已删除的功能

以下功能不再可用:

CRaSH 支持

Spring Mobile 的自动配置和依赖关系管理。

Spring Social 的自动配置和依赖关系管理。

依赖关系管理。

依赖版本

以下库的最低支持版本已更改:

Elasticsearch 5.6

Gradle 4

Hibernate 5.2

Jetty 9.4

Spring Framework 5

Spring Security 5

Tomcat 8.5

参考资料

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180308G047E900?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券