![img](https://mmbiz.qpic.cn/mmbiz_jpg/1flHOHZw6Rs7yEJ6ItV43JZMS7AJWoMSZtxicnG0iaE0AvpUHI8oM7lxz1rRsmaa4IfbolVRG2WQwhXrchmVWS8Q/640?tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)

### 前提

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

### 在你开始之前

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

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

```
1
2 org.springframework.boot
3 spring-boot-properties-migrator
4
```

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

### 构建您的 Spring Boot 应用程序

#### Spring Boot Maven 插件

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

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

```
1mvn spring-boot:run -Dspring-boot.run.profiles=prod
```

##### Surefire 默认值

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

```
1
2 org.apache.maven.plugins
3 maven-surefire-plugin
4
5
6 **/*Tests.java
7 **/*Test.java
8
9
10 **/Abstract*.java
11
12
13
```

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

#### Spring Boot Gradle 插件

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

##### 依赖管理

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

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

```
1apply plugin: 'org.springframework.boot'
2apply plugin: 'io.spring.dependency-management' // requestFactorySupplier)`方法所取代。`Supplier`允许构建器生成的每个模板使用它自己的请求工厂,从而避免共享工厂可能导致的副作用。见#11255。

##### WebJars 定位器

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

#### Security

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

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

```
1security.basic.authorize-mode
2security.basic.enabled
3security.basic.path
4security.basic.realm
5security.enable-csrf
6security.headers.cache
7security.headers.content-security-policy
8security.headers.content-security-policy-mode
9security.headers.content-type
10security.headers.frame
11security.headers.hsts
12security.headers.xss
13security.ignored
14security.require-ssl
15security.sessions
```

##### 默认安全

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

##### 默认用户

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

##### AuthenticationManager Bean

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

##### OAuth2

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

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

##### 执行器安全

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

例如,假设以下配置:

```
1endpoints.flyway.sensitive=false
2endpoints.info.sensitive=true
3management.security.roles=MY_ADMIN
1http
2 .authorizeRequests()
3 .requestMatchers(EndpointRequest.to("health", "flyway")).permitAll()
4 .requestMatchers(EndpointRequest.toAnyEndpoint()).hasRole("MY_ADMIN")
5 ...
```

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

#### 使用 SQL 数据库

##### 配置数据源

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

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

```
1
2 org.springframework.boot
3 spring-boot-starter-data-jpa
4
5
6 org.apache.tomcat
7 tomcat-jdbc
8
9
10
11
12
13 com.zaxxer
14 HikariCP
15
```

现在可以这样修改:

```
1
2 org.springframework.boot
3 spring-boot-starter-data-jpa
4
```

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

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

##### JPA 和 Spring Data

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

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

##### Flyway

Flyway 配置键被移动到`spring`命名空间(即`spring.flyway`)

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

- 首先将您的`1.5.x`Spring Boot 应用程序升级到 Flyway 4,请参阅Maven和Gradle的说明。
- 一旦您的架构升级到了 Flyway 4,升级到 Spring Boot 2 并再次运行迁移以将您的应用程序移植到 Flyway 5。

##### Liquibase

Liquibase 配置键被移动到`spring`命名空间(即`spring.liquibase`)

##### 数据库初始化

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

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

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

#### 整合 NoSQL

##### Redis

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

##### Elasticsearch

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

#### 高速缓存

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

无法自动配置常规`HazelcastInstance`和专用`HazelcastInstance`缓存。因此,该`spring.cache.hazelcast.config`属性已不再可用。

#### 批量

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

#### 测试

##### Mockito 1.x

Mockito 1.x 不再支持`@MockBean`和`@SpyBean`。如果你不用`spring-boot-starter-test`来管理你的依赖关系,你应该升级到 Mockito 2.x.

### Spring Boot Actuator

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

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

#### 构建

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

#### Keys 的配置结构

Endpoints 基础配置 key 已经统一:

| 旧的属性 | 新的属性 |
| ------------------------- | ---------------------------------------- |
| `endpoints..*` | `management.endpoint..*` |
| `endpoints.cors.*` | `management.endpoints.web.cors.*` |
| `endpoints.jmx.*` | `management.endpoints.jmx.*` |
| `management.address` | `management.server.address` |
| `management.context-path` | `management.server.servlet.context-path` |
| `management.ssl.*` | `management.server.ssl.*` |
| `management.port` | management.server.port |

#### 基本路径

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

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

例如,如果你设置`management.server.servlet.context-path=/management`和`management.endpoints.web.base-path=/application`,你就可以在下面的路径到达终点健康:`/management/application/health`。

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

```
1management.endpoints.web.base-path=/
```

#### 审计事件 API 更改

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

#### Endpoints

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

- **无论您的应用程序中是否存在和配置 Spring Security**,只有端点`/health`和`/info`端点都是暴露的。
- 所有端点,但`/shutdown`已启用。

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

```
1management.endpoints.web.exposure.include=*
```

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

```
1management.endpoint.shutdown.enabled=true
```

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

```
1management.endpoints.web.exposure.include=*
2management.endpoints.web.exposure.exclude=env
```

##### Endpoint changes

![img](https://mmbiz.qpic.cn/mmbiz_png/1flHOHZw6Rs7yEJ6ItV43JZMS7AJWoMSUyLfWBQDnjEMvktV5oxdfGDLkLQlwC51zdCdGYU4BZicKgdPWicuFxSw/640?tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)

端点属性已更改如下:

- `endpoints..enabled` 已经转移到了 `management.endpoint..enabled`
- `endpoints..id` 没有替换(端点的 ID 不再可配置)
- `endpoints..sensitive`没有替代品(请参见执行器安全)
- `endpoints..path` 已经转移到了 `management.endpoints.web.path-mapping.`

#### 端点格式

##### `/actuator/mappings` 端点大改变

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

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

##### `/actuator/httptrace` 端点大改变

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

#### 迁移自定义端点

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

### Metrics

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

#### 设置 icrometer

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

#### 迁移定制计数器/量表

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

- 注入`MeterRegistry`和调用方法。
- 直接调用静态方法`Counter featureCounter = Metrics.counter("feature");`。

### 开发者工具

#### 热拔插

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

#### Devtools 远程调试隧道

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

### 已删除的功能

以下功能不再可用:

- CRaSH 支持
- Spring Mobile 的自动配置和依赖关系管理。
- Spring Social 的自动配置和依赖关系管理。
- 依赖关系管理`commons-digester`。

### 依赖版本

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

- 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

------

**推荐阅读**:

- [一致性hash算法 - consistent hashing](http://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247485714&idx=1&sn=55539dab6a03cec684cb3c527b31d35a&chksm=fb3f10e9cc4899ff897d38e23d92aabbfd9512436a3290ac4950447b8fc2ba69df9cfc644de8&scene=21#wechat_redirect)
- [JSON Web Token - 在Web应用间安全地传递信息](http://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247485718&idx=1&sn=4a07a1ae8eca21c87f04755d1ef3ab38&chksm=fb3f10edcc4899fbd221bcc8fea6918a3cc531865c6573bedcc9c5cd309e14f0b0015080b358&scene=21#wechat_redirect)
- [你真的了解lambda吗?(纠错篇)](http://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247485726&idx=1&sn=f0bb43842f595d73ee74e5e583890b87&chksm=fb3f10e5cc4899f3b4792d08025dcfda6387c3bcbf618561678cb6d37eece62426d980dfacfc&scene=21#wechat_redirect)
- [[译\] Kubernetes 儿童插图指南](http://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247485725&idx=2&sn=f0904ffbc3d1cce04bca3222ab2cae8e&chksm=fb3f10e6cc4899f0a56fa3568a9def6098e99b09be314c243cfe57d3fd416e9c19c25c0545b0&scene=21#wechat_redirect)
- [Spring Boot 最流行的 16 条实践解读!](http://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247485733&idx=1&sn=94e1fa48c45e21c642cd3cfcf36e1919&chksm=fb3f10decc4899c8d16b2d1c9f2f2ca3624ce8b151779c77c713e2bae88c4ef22e1254b42a15&scene=21#wechat_redirect)
- [SpringBoot使用Docker快速部署项目](http://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247485741&idx=1&sn=b048dfa7110ac22b09319af5806a8307&chksm=fb3f10d6cc4899c0338be7ba5c7b63688a8d8c0ce3d2a56d2db387636f9939c2a951f8280c60&scene=21#wechat_redirect)
- [MAT入门到精通(一)](http://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247485741&idx=2&sn=69947853fda57fd7df59a953f8328649&chksm=fb3f10d6cc4899c05f7c630665520d771930320f20e65415ab00f32c9187de1a3dd5f03b0859&scene=21#wechat_redirect)
- [回调“地狱”与反应模式](http://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247485746&idx=1&sn=a68c1c21c146c98170786e71d4bfbf40&chksm=fb3f10c9cc4899dff7d634eec19c6bfc627706a0ff5d3c62aaf4ea98a9b9376324b3c80f0e3c&scene=21#wechat_redirect)
- [干货 | Debezium实现Mysql到Elasticsearch高效实时同步](http://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247485750&idx=1&sn=65f2a6dda4486eec527056e0c22e0256&chksm=fb3f10cdcc4899db165681c361116c09f093a303dac1c3fd787d1b45a6eaf43c7bcfd90c4349&scene=21#wechat_redirect)

![img](https://mmbiz.qpic.cn/mmbiz_jpg/wbiax4xEAl5xa7FFaZo7VyJ5LQicljGCFOicKHziaovBFGstjMKKlxymS2IDPEzHEhpKykY3EFibz3zjPgxzdlMic0oA/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)

Spring Boot 2.0 迁移指南的更多相关文章

  1. Spring Boot 2.0 升级指南

    Spring Boot 2.0 升级指南 前言 Spring Boot已经发布2.0有5个月多,多了很多新特性,一些坑也慢慢被填上,最近有空,就把项目中Spring Boot 版本做了升级,顺便整理下 ...

  2. Spring Boot 2.0 入门指南

    0x01 什么是Spring Boot? Spring Boot是用来简化Spring应用初始搭建以及开发过程的全新框架,被认为是Spring MVC的“接班人”,和微服务紧密联系在一起. 0x02 ...

  3. Spring Boot 2.0系列文章(五):Spring Boot 2.0 项目源码结构预览

    关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/04/15/springboot2_code/ 项目结构 结构分析: Spring-boot-pr ...

  4. Spring Boot 2.0系列文章(七):SpringApplication 深入探索

    关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/04/30/springboot_SpringApplication/ 前言 在 Spring B ...

  5. 学习Spring Boot:(二十七)Spring Boot 2.0 中使用 Actuator

    前言 主要是完成微服务的监控,完成监控治理.可以查看微服务间的数据处理和调用,当它们之间出现了异常,就可以快速定位到出现问题的地方. springboot - version: 2.0 正文 依赖 m ...

  6. Spring Boot 2.0 新特性

    这是一篇总结文章,主要收集 Spring Boot 2.0 相对于 Spring Boot 1.x 的新特性,本章节并不提供实践性质的源代码.在 Spring Boot 系列文章中会持续退出实践章节. ...

  7. 【SFA官方翻译】使用 Kubernetes、Spring Boot 2.0 和 Docker 的微服务快速指南

    [SFA官方翻译]使用 Kubernetes.Spring Boot 2.0 和 Docker 的微服务快速指南 原创: Darren Luo SpringForAll社区 今天 原文链接:https ...

  8. 195. Spring Boot 2.0数据库迁移:Flyway

    [视频&交流平台] àSpringBoot视频:http://t.cn/R3QepWG à SpringCloud视频:http://t.cn/R3QeRZc à Spring Boot源码: ...

  9. Spring Boot 2.0 热部署指南

    Spring Boot 2.0 支持热部署,实现方法很简单 Spring Boot 2.0 有几种热重载的选项. 推荐的方法是使用spring-boot-devtools 因为它提供了额外的开发时间功 ...

随机推荐

  1. Win10《芒果TV - Preview》官方指定预览版 - 重要使用注意事项

    Win10<芒果TV - Preview>官方指定预览版,最新的改进和功能更新将会此版本优先体验. 重要使用注意事项: 1.因为方便过审核,默认将会员相关的操作提示简化: 2.使用中务必手 ...

  2. 零元学Expression Blend 4 - Chapter 16 用实例了解互动控制项「Button」II

    原文:零元学Expression Blend 4 - Chapter 16 用实例了解互动控制项「Button」II 本章将教大家如何制作自己的Button,并以玻璃质感Button为实作案例. ? ...

  3. vmstat命令浅析

    vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况.这个命令是我查看Linux/Unix最 ...

  4. 深度网络中的Tricks

    数据增强(Data augmentation) 预处理(Pre-processing) 初始化(Initializations) 训练中的Tricks 激活函数(Activation function ...

  5. iOS和Android使用MQTT协议实现消息推送和即时通讯(替代XMPP,已经有TMS MQTT)

    大多数应用都会涉及到即时聊天的功能,在开源方案中有XMPP和MQTT.其中XMPP是基于XML的,并且不支持消息质量QOS, 所以本身并没有消息重传的机制,从而会导致丢消息.而MQTT是基于二进制的, ...

  6. 预处理器#include 指令

    预处理器发现 #include 指令后,就会寻找后跟的文件名并把这个文件的内容包含到当前文件中.被包含文件中的文本将替换源代码文件中的#include指令,就像你把被包含文件中的全部内容键入到源文件中 ...

  7. XP系統IIS最大連接數修改

    方法一: 安裝軟件 http://download.microsoft.com/download/iis50/Utility/5.0/NT45/EN-US/MtaEdt22.exe 然後進入  W3S ...

  8. 原生js封装轮播图

    个人实际开发中用到的效果问题总结出来便于自己以后开发查看调用,如果也适用其他人请随意拿走勿喷就行! 原生js对于思路要求比较高,在js代码我都写有备注,足够理解并使用,即使是小白或者刚入行的程序员也比 ...

  9. 基于 Roslyn 实现动态编译

    基于 Roslyn 实现动态编译 Intro 之前做的一个数据库小工具可以支持根据 Model 代码文件生成创建表的 sql 语句,原来是基于 CodeDom 实现的,最近改成使用基于 Roslyn ...

  10. Unity Shader 菲涅尔环境反射

    菲涅尔反射描述了一种光学现象,当光照到物体表面时,一部分发生反射,另一部分则进入物体内部,发生折射或散射:相比直接的反射和折射计算,菲涅尔反射更接近真实情况. 可用下面的等式近似计算这种反射效果: F ...