译者的话:尽管已经过去了一年,但有关第二次启动的新功能的问题并没有就此结束。 从头开始编写此类内容并不是最明智的想法。 因此,我们决定翻译这篇文章,这对我们来说似乎最简洁,同时也很完整。
Spring Boot 2的发布于2018年初,每个人都渴望尽快将其投入使用。 此版本是17个月工作的高潮,来自215个不同人员的6,800多个提交。 有很多很酷的功能值得讨论,所以让我们谈谈Spring Boot 2的新功能。
在本文中,我们将考虑:
- 春靴的故事
- Spring Boot的新功能
- Spring Boot 2升级指南
春季靴的历史
在研究创新之前,我想借此机会介绍一下Spring Boot的历史。 在2013年8月发布的帖子中, Phil Webb在他的博客上宣布了一个名为Spring Boot的项目的第一个里程碑版本 。
创建Spring Boot的目的是简化在Spring上创建即用型应用程序和服务的过程,而无需付出过多努力。 Spring Boot是对Spring平台的主观观察,它使Spring的初学者和经验丰富的用户都可以找到他们需要的一切。 使用Boot,您可以创建独立的应用程序,以“ java-jar”运行或以更传统的WAR格式分发。
大约9个月后,2014年4月,发布了Spring Boot 1.0。 从那时起,出现了许多次要版本和新的有用功能。
Spring Boot 1.1(2014年6月)
- 春季启动启动器测试
- 指标和健康指标
- 弹性搜索,Apache Solr,Spring Social和Spring Integration自动配置
- 模板支持(Freemaker,Groovy和Velocity)
Spring Boot 1.2(2015年3月)
- Servlet 3.1,Tomcat 8和Jetty 9
- 春天4.1
- @SpringBootApplication批注
- 电子邮件支持
Spring Boot 1.3(2016年12月)
- 将Spring Framework升级到4.2版
- 将Spring Security升级到版本4.0
- 开发人员工具
- 缓存自动配置
- 完全可执行的JAR和服务支持
Spring Boot 1.4(2017年1月)
- 春季4.3
- 休眠5
- 测试增强
- 整合入门
- 支持Couchbase和Neo4J
Spring Boot 1.5(2017年2月)
- 记录器端点
- Apache Kafka支持
- Cloud Foundry的高级机制
- LDAP支持
- 测试更新
春季新消息
那么Spring Boot 2有什么新功能? 如果我们谈论最大的创新,那么这是Spring框架到第5版的更新。 自从2017年9月发布Spring Framework 5以来,大多数开发人员(像我一样)一直在等待Spring Boot 2的发布。SpringFramework 5具有相当多的新功能列表,但是我只想谈一谈一些最重要的功能。
Spring Framework 5的新增功能
Java 8+版本支持
如果您仍然想在Spring Framework上构建应用程序,则需要使用Java 8+版本。 您可能认为这对我们所有人来说都是非常重要的变化,但对于Spring团队而言,这甚至更为重要。 这允许将其所有新功能(例如lambda表达式或流)更新为Java 8的源代码库。 这不仅使代码更具可读性,而且提高了平台核心的性能。
Java 9支持
如果您想使用Java 9,则需要升级到Spring Framework 5以及Spring Boot2。我知道许多人仍然没有在生产中使用最新版本的Java,这是尝试新的炫酷“玩具”的绝佳机会。 使用标准类路径时,一切都应该正常工作,但是我读到了一些切换到Java 9模块时遇到的困难。
春季MVC
尽管Spring MVC并不是本文的重点,但值得一提的是,这里有一些不错的升级。 我不会再赘述;有关详细信息,请参见Spring Framework 5的文档 。
春季webflux
异步数据流是Spring Framework 5故事的核心。这是一种完全不同的思维方式,但是幸运的是,对于我们来说,无需重新学习如何以全新的方式编写应用程序。 Spring WebFlux是一个绝对异步且无阻塞的框架,从头开始构建,可让您应对大量的并行连接。 尽管这是范式的革命,但开始并非难事。

Kotlin支持
在http://start.spring.io中添加了对Kotlin的支持,但是Spring Framework 5对这种语言提供了专门的支持,带来了有用的功能,您可以在这里阅读有关它们的信息 。
测试增强
测试系统的最大变化是完全支持JUnit 5 Jupiter。 稍后我将详细讨论,但是当您在Spring Boot 2上启动新应用程序时,默认情况下仍会使用JUnit 4,但是,切换到JUnit 5是一项艰巨的任务。
Spring Boot 2的新功能
第三方图书馆更新
在每个新版本的Spring Boot中,Spring团队都有机会更新各种依赖关系。
- 胸腺3 *
- 码头9.4
- 的Tomcat 8.5
- 休眠5.2
- 飞路5
- 摇篮4
* Thymeleaf启动器现在具有内置的thymeleaf-extras-java8time。
安全性和反应性Spring数据
随着转向Spring WebFlux,Spring Data添加了对具有异步数据流的应用程序的支持。 Cassandra,MongoDB,Couchbase和Redis当前具有异步API支持。 Spring Boot为所有这些启动器提供了POM启动器,使其易于入门。
在我们的响应式应用程序中还有机会使用Spring Security 5.0。
执行器
Spring Boot Actuator并不是什么新鲜事物,但是它是从头开始重写的。 如果您还不熟悉Actuator,请执行以下操作:它自动显示端点以获取有关应用程序状态的信息。 Spring Boot 1.x中的Actuator是在servlet之上编写的,通过新的响应式方法,Spring团队需要一个既支持旧方法又支持响应式方法的解决方案。 此外,对执行器进行了以下更改:
- 重新设计以支持servlet和反应性
- 状态和详细的健康检查分开
- 简化的安全模型
- 切换到千分尺(就像SLF4J,仅用于度量标准)
- 改进的JSON数据结构
- 创建自定义端点的简化过程。
- 终点
- @WebEndpoint
- @JmxEndpoint
由于安全模型的更改,升级中可能会遇到困难,我们将在后面讨论。 默认情况下,所有Web端点都可以通过/actuator
路径访问,格式为/actuator/{id}
。 / actuator
路径可以在management.endpoints.web.base-path
设置中更改。
Spring Boot Actuator Web API端点有一个单独的详细文档块,值得开始介绍此工具。
Gradle插件
我一直很喜欢Gradle,我很高兴团队决定重写Gradle的插件。
Spring Boot Gradle插件可让您在Gradle中实现Spring Boot支持,并允许您打包可执行jar或war归档文件,在Spring Boot上运行应用程序以及通过spring-boot-dependencies管理依赖关系。 Spring Boot中的Gradle插件需要Gradle 4.0及更高版本。
开始使用
要开始使用插件,您需要将其上传到项目。
buildscript { repositories { maven { url 'https://repo.spring.io/libs-milestone' } } dependencies { classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.0.0.RC1' } } apply plugin: 'org.springframework.boot'
创建可执行的jar和war档案
bootRepackage任务已由bootJar和bootWar代替,分别创建jar和war文件。 与标准Gradle类似命令相比,这两项任务均具有更多功能,从而可以访问所有设置和逻辑。
依赖管理
Spring Boot Gradle插件不再自动拉出依赖性管理插件。 相反,Gradle Spring Boot插件会看到依赖项管理插件已连接,并导入了正确版本的BOM。 这使您可以更好地控制在何处以及如何配置依赖项管理。 对于大多数应用程序,添加一个依赖管理插件就足够了:
apply plugin: 'io.spring.dependency-management'
Gradle插件有自己的文档 ,其中包含非常有用的信息。 我建议任何想开始使用Gradle的人都点击此链接。
简化的安全性
Spring Boot 2.x的主要目标之一是简化安全配置并使其易于添加自定义安全设置。 默认情况下,所有数据都受到保护,包括静态资源和Actuator端点。 如果Spring Security在类路径中,则Spring Boot将添加@EnableWebSecurity
批注,将使用哪种特定的身份验证机制将确定Spring Security的内容协商机制。
当用户配置其安全规则时,标准的Spring Boot安全配置将停止运行。 此时,用户将需要尽可能准确地阐明所有安全规则。 这意味着所有安全设置都集中在一个地方,并且使用现有WebSecurityConfigurerAdapters
处理命令的顺序没有问题。
各个安全设置的示例:
http .authorizeRequests() // 1 .requestMatchers(EndpointRequest.to("status", "info")) .permitAll() // 2 .requestMatchers(EndpointRequest.toAnyEndpoint()) .hasRole("ACTUATOR") // 3 .requestMatchers(StaticResourceRequest.toCommonLocations()) .permitAll() // 4 .antMatchers("/**") .hasRole("USER") .and() ... // additional configuration
/status
和/info
不需要授权。- 所有其他执行器均使用
ACTUATOR
角色受到保护。 - 共享静态资源的位置向所有人开放。
- 所有其他应用程序端点均受
USER
角色保护。
执行器安全
考虑到执行器端点是固定的,因此必须根据需要启用或排除端点。 这是控制此设置的设置,自1.x版以来已更改。
# ENDPOINTS WEB CONFIGURATION (WebEndpointProperties) management.endpoints.web.exposure.include=info,health # Endpoint IDs that should be included or '*' for all. management.endpoints.web.exposure.exclude= # Endpoint IDs that should be excluded. management.endpoints.web.base-path=/actuator # Base path for Web endpoints. Relative to server.servlet.context path or management.server.servlet.context-path if management.server.port is configured. management.endpoints.web.path-mapping= # Mapping between endpoint IDs and the path that should expose them.
如果不确定如何配置这些设置,请在文档中为常规应用程序设置添加书签。
HTTP / 2支持
令人难以置信的是,HTTP 1.1规范的发布已经在1996年。 我想您不必提醒您,现代网络在所有方面都有所不同。 如果要在Spring MVC或WebFlux上的应用程序中实现HTTP / 2支持,请使用以下参数。
server.http2.enabled=true
HTTP / 2支持取决于所选的Web服务器和应用程序环境,因为开箱即用的JDK8不支持此协议。 在文档中阅读有关此内容的更多信息。
配置选项
在Spring Boot 1.x中,支持所谓的轻松绑定,换句话说,您可以通过多种方式(驼峰式,下划线,连字符)确定参数名称,最后,将值分配给相同的属性。
宽松的绑定以相同的方式工作,并且您在代码中读取变量的方式已更改:

24.外部化配置
Spring Boot使您可以外部化配置,以便可以在不同的环境中使用相同的应用程序代码... docs.spring.io
公制
定制的Spring Boot指标已被测微仪取代。 它是由Pivotal团队开发的,可以迅速适应Pivotal项目。
Spring Boot Actuator为Micrometer提供了自动配置, Micrometer是一种支持多种监视类型的应用程序度量接口,包括:

有关千分尺的更多信息, 请访问https://micrometer.io/ 。
因此,进行升级可能会使记录大量自定义指标的用户感到痛苦。
石英调度器
Spring Boot 2支持Quartz计划任务执行库,可以使用spring-boot-starter-quartz启动程序轻松添加。 在RAM和JDBC上受支持的工作。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>
HikariCP连接池
标准连接池已从Tomcat更改为HikariCP。 如果您使用spring.datasource.type来使Hikari在Tomcat应用程序中工作,则可以将其删除。 同样,如果要继续使用Tomcat池,只需将以下内容添加到配置中:
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
开发人员工具
默认情况下,每次重新启动应用程序时,都会记录有关配置差异的报告。 换句话说,该报告显示了在进行诸如删除/添加bean和设置配置参数之类的更改时应用程序的自动配置发生的更改。
要禁用此报告的记录,请配置以下参数:
spring.devtools.restart.log-condition-evaluation-delta=false
Kotlin支持
本文前面提到了Kotlin的官方支持。 Kotlin也有专门的文档块 。
Junit 5
如上所述,Spring Boot应用程序仍然默认使用JUnit 4,如果要升级到JUnit 5,则需要从spring-boot-starter-test中排除JUnit 4并添加必要的依赖项。 您还将需要以下列表中的插件。
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>junit</groupId> <artifactId>junit</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <dependencies> <dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-surefire-provider</artifactId> <version>${junit-platform.version}</version> </dependency> </dependencies> </plugin> </plugins> </build>
Spring Boot 2升级指南
我认为您不能谈论如此明显的事实,即发行如此之大的版本,仅更改生产版本号并不是升级的最佳方法。 首先,我建议阅读Spring Boot 2.0 Migration Guide 。 我个人发现,通过简化的安全模型和参数更改可以解决大多数问题。 本指南提供了一些有关迁移参数文件的重要技巧。
在Spring Boot 2.0中,许多配置参数被重命名/删除,开发人员需要更新application.yml
以反映这些更改。 为了完成此任务,Spring Boot提供了一个新的spring-boot-properties-migrator
模块。 作为依赖项添加到项目中后,它不仅可以分析应用程序环境并在启动时显示诊断结果,还可以在运行时临时迁移参数。 这是迁移应用程序时的必要步骤:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-properties-migrator</artifactId> </dependency>
我不知道您对此有何想法,但我一定会开始使用Spring Boot 2并开始将代码迁移到该版本,但是通常在任何主要版本中,我都等待下一个次要版本的发布。 这不仅适用于Spring,而且适用于从Apple到Pivotal甚至Angry Birds的其他品牌!