Spring Boot 2:有什么新功能?

译者的话:尽管已经过去了一年,但有关第二次启动的新功能的问题并没有就此结束。 从头开始编写此类内容并不是最明智的想法。 因此,我们决定翻译这篇文章,这对我们来说似乎最简洁,同时也很完整。


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是一个绝对异步且无阻塞的框架,从头开始构建,可让您应对大量的并行连接。 尽管这是范式的革命,但开始并非难事。


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 

  1. /status/info不需要授权。
  2. 所有其他执行器均使用ACTUATOR角色受到保护。
  3. 共享静态资源的位置向所有人开放。
  4. 所有其他应用程序端点均受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的其他品牌!

Source: https://habr.com/ru/post/zh-CN438980/


All Articles