【官方文档】Spring Boot 2.0 迁移指南 已翻译 100%

oschina 投递于 02/27 19:08 (共 24 段, 翻译完成于 03-12)
阅读 28675
收藏 48
14
加载中

本文档主要通过开发指南的方式来帮助您将应用程序迁移到 Spring Boot 2.0。

在你开始之前

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

在 Spring Boot 2.0 中,许多配置属性已被重命名或被删除,相应地,开发者需要升级他们的 application.properties/application.yml。为了方便升级,Spring Boot 发布了一个新的 spring-boot-properties-migrator 模块。只要将其作为依赖添加到项目中,它不仅会分析应用程序的环境并在启动时打印诊断信息,而且还会在运行时为项目临时迁移属性。在您的应用程序迁移期间,这个模块是必备的:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-properties-migrator</artifactId>
</dependency>

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

如果你想查看具体内容,请参阅以下资源,或者继续阅读下一节。

AmosWang
AmosWang
翻译于 02/27 19:34
5

构建你的 Spring Boot 应用

Spring Boot 的 Maven 插件

为保持一致性,以及避免与其它插件的冲突,现在暴露的插件配置属性都以 spring-boot 为前缀。

例如,使用下面的命令行能启用名字为 foo 的配置文件:

mvn spring-boot:run -Dspring-boot.run.profiles=foo

Surefire 插件的默认值

惯用的 include/exclude 配置模式已经和最新的 Surefire 插件默认集成。如果依赖于此插件,需要相应地更新插件配置。之前对应的配置如下:

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-surefire-plugin</artifactId>
	<configuration>
		<includes>
			 <include>**/*Tests.java</include>
			 <include>**/*Test.java</include>
		</includes>
		<excludes>
			<exclude>**/Abstract*.java</exclude>
		</excludes>
	</configuration>
</plugin>

注意:如果你使用的是 JUnit 5 版本,你应该将 Surefire 降级到 2.19.1 版本。**/*Tests.java  模式不包含在此版本,所以如果你依赖于它,请确保在你已配置文件中将其添加。

dreamanzhao
dreamanzhao
翻译于 02/28 14:02
4

Spring Boot 的 Gradle 插件

Spring Boot 的 Gradle 插件经过了重大的重写,并带来了大量的改进。你可以通过参阅手册和 api 文档以了解插件的功能。

依赖管理

Spring Boot 的 Gradle 插件不再自动应用依赖管理插件。与之代替的是,Spring Boot 的插件现在可以通过导入正确版本的 spring-boot-dependencies bom 来应用依赖管理插件。当依赖管理被配置的时候,这一点会让你有更多的控制权。

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

apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management' // <-- 添加这个到你的 build.gradle

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

构建可执行的 jar 和 war

bootRepackage 任务已经被替换成 bootJar 和 bootWar 任务,分别用于构建可执行的 jar 包和 war 包。

配置更新

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

溪边九节
溪边九节
翻译于 02/28 14:05
1

Spring Boot 特性

默认动态代理策略

Spring Boot现在默认使用CGLIB动态代理(基于类的动态代理), 包括AOP. 如果需要基于接口的动态代理(JDK基于接口的动态代理) , 需要设置spring.aop.proxy-target-class属性为false.

SpringApplication

Web Environment

Spring Boot 应用现状可以运行于更多的模式, 所以spring.main.web-environment属性现在不赞成使用, 可以使用spring.main.web-application-type提供更多功能.

如果想让应用以非web服务方式启动, 需要更改属性值:

spring.main.web-application-type=none

Tip:可以通过SpringApplication的setWebApplicationType方法实现

Spring Boot 应用时间变更

我们提供了一个新的事件(event)-ApplicationStartedEvent. ApplicationStartedEvent在context刷新之后, 应用或命令行调用之前发送(send). ApplicationReadyEvent在应用活命令行调用之后发送. 表名应用以准备好提供服务。

参考 updated reference documentation.

Banner

我们想要减少Spring Boot使用的命名空间数量, banner-related属性迁移到spring.banner.

浪子_仗剑走天涯
浪子_仗剑走天涯
翻译于 03/01 12:01
1

外部化配置

Relaxed binding 宽松绑定

有关宽松绑定的规则已经收紧。 我们假设有一个的acme.my-project.my-name属性:

  1. 所有前缀必须是kebab格式(小写,连字符分隔),acme.myProject或acme.my_project是无效的 - 你必须在此处使用acme.my-project

  2. 属性名称可以使用kebab-case(my-name),camel-case(myName)或snake-case(my_name)

  3. 环境属性(来自OS环境变量)必须使用常规的大写下划线格式,其中下划线只能用于分隔关键词的各个部分,ACME_MYPROJECT_MYNAME

Tocy
Tocy
翻译于 02/28 09:39
2

新的宽松绑定有若干优势:

  • 只要键值是按照标准格式定义的,就无需担忧在 @ConditionalOnProperty: 中键值的结构,被支持的宽松的变量将会自动透明的工作。如果你正在使用 prefix 属性,你可以简单地通过使用 name 或者value 属性 放入全键值。
  • 源于Environment 关注自动化,RelaxedPropertyResolver 将不再可用:env.getProperty("com.foo.my-bar") 将找到一个 com.foo.myBar 属性。

org.springframework.boot.bind 包将不再可用,现被 new relaxed binding infrastructure 替换。

特别是,RelaxedDataBinder 相关的应用方式被替换为新的绑定API。下面的列子实现一个 com.foo 为前缀的配置到一个 POJO。

new Binder(ConfigurationPropertySources.from(propertySource))
		.bind("com.foo", Bindable.of(target)))

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

FlagType flagType = Binder.get(environment)
		.bind("acme.app.my-flag", FlagType.class)
		.orElse(FlagType.DEFAULT);

@ConfigurationProperties 校验

如果要打开校验,需要在@ConfigurationProperties 对象上添加注解@Validated。

Configuration location 配置位置

spring.config.location 配置的实现已经配置设定;基于提前添加一个位置到默认配置列表,现在它替换了 默认配置。

如果你是按照以前的方式进行处理,你应该使用spring.config.additional-location进行替换。

360linker
360linker
翻译于 03/02 09:56
0

开发网页应用

嵌入式容器封装结构

为了支持响应式的使用案例,嵌入式容器封装结构已经很大程度上进行重构。EmbeddedServletContainer已经被重命名为WebServer, 同时org.springframework.boot.context.embedded包已经被迁移至org.springframework.boot.web.embedded。例如,如果你之前使用TomcatEmbeddedServletContainerFactory回调接口来自定义嵌入式的Tomcat容器,现在你应该使用TomcatServletWebServerFactory。

Servlet-specific的关于server的属性

一些Servlet-specific已经移动到server.servlet的server.*属性:


旧属性 新属性

server.context-parameters.*

server.servlet.context-parameters.*

server.context-path

server.servlet.context-path

server.jsp.class-name

server.servlet.jsp.class-name

server.jsp.init-parameters.*

server.servlet.jsp.init-parameters.*

server.jsp.registered

server.servlet.jsp.registered

server.servlet-path

server.servlet.path

作为传递性依赖的Web Starter

先前一些Spring Boot Starter是依赖于Spring MVC的 spring-boot-starter-web。在Spring WebFlux的新的支持下,spring-boot-starter-mustache, spring-boot-starter-freemarker 和spring-boot-starter-thymeleaf不再依赖它了。选择并添加spring-boot-starter-web 或spring-boot-starter-webflux是开发者的职责。


dreamanzhao
dreamanzhao
翻译于 02/28 16:26
2

模板引擎

Mustache模板默认的文件扩展名

Mustache模板的文件扩展名曾经是.html。现在的扩展名为.mustache,与官方规格和大多数的IDE插件保持一致。你可以通过更改spring.mustache.suffix配置文件的configuration key来重写这个新的默认值。

Jackson/JSON支持

在2.0版本,我们已经设置Jackson配置文件的默认值,将ISO-8601 strings写作了JSR-310。如果你希望返回之前的设置,可以添加spring.jackson.serialization.write-dates-as-timestamps=true 到你的配置文件中。

一个新的spring-boot-starter-json starter收集了必要的位去读写JSON。它不仅提供了jackson-databind,而且提供了和Java8一起运作的时候相当有用的组件:jackson-datatype-jdk8, jackson-datatype-jsr310 和jackson-module-parameter-names。如果你曾经手动地依赖这些组件,现在可以依赖这个新的starter取代。


dreamanzhao
dreamanzhao
翻译于 02/28 16:50
1

符合默认行为变化的Spring MVC路径

我们已经决定更改默认关于Spring MVC应用的后缀路径(看#11105)。这个性质已经不再默认启动,请参照best practice documented in Spring Framework

如果你的应用期望像 "GET /projects/spring-boot.json" 这样的请求可以被映射到@GetMapping("/projects/spring-boot"),这一变化正在影响你。

有关的更多信息和如何减少这种变化,请参考 Spring Boot有关路径匹配和内容协商的参考文档


Servlet过滤器

现在Servlet过滤器默认的dispatcher控制器类型是DipatcherType.REQUEST;这个Spring Boot的默认值与Servlet specification的默认值保持一致。如果你想要映射一个过滤器到其它的控制器类型,请使用FilterRegistrationBean注册你的过滤器。

注意:Spring Security和Spring Session过滤器是用来配置 ASYNCERROR, 和REQUEST的控制器类型。

dreamanzhao
dreamanzhao
翻译于 03/01 11:40
1

RestTemplateBuilder

requestFactory(ClientHttpRequestFactory) 被替换成一个新的requestFactory(Supplier<ClientHttpRequestFactory> requestFactorySupplier). Supplier接口允许每个template使用自己的request factory创建, 从而避免了共享一个工厂方法的不良影响. 参考 #11255.

WebJars Locator

Spring Boot 1.x 提供的org.webjars:webjars-locatorwebjars-locator依赖管理是 "poorly named library … that wraps the webjars-locator-core project". org.webjars:webjars-locator依赖应替换成org.webjars:webjars-locator-core.

浪子_仗剑走天涯
浪子_仗剑走天涯
翻译于 03/01 12:27
1
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(6)

slliver
slliver
谢谢~
zhisheng_t
zhisheng_t
http://www.54tianzhisheng.cn/2018/03/06/SpringBoot2-Migration-Guide/

我也参考官方文档翻译了下
水牛爱生活
感谢大神们的辛勤劳动,致敬!
宋晶磊
辛苦了
辣鸡程序员
辣鸡程序员
辛苦
axiba88
axiba88
辛苦了,各位😄
返回顶部
顶部