在Spring Boot 2中有什么新内容?
A look at new features in Spring Framework 5 & Spring Boot 2
Spring Boot 2刚刚发布,在最近的几个月里,我很兴奋地看到它不停的在更新。这个版本是17个月的工作的最高点的见证,由215个不同的人提交超过了6800次。有一些很棒的功能可以讨论,让我们来讨论一下Spring Boot 2中的新特性。
在这篇文章中我们将会看到:
- Spring Boot的历史
- Spring Boot中的新东西
- Spring Boot 2 迁移指南
- 其他的资源
Spring Boot的历史
在我们深入看新的变化之前我们先借这个机会来了解一下Spring Boot的历史。这篇博客在2013年8月发布,Phil Webb宣布了一个名为Spring Boot的新项目的第一个里程碑版本。
Spring Boot的目标是使创建Spring驱动的、生产级的应用程序和服务更加容易。它采用了Spring平台的有主见的观点,以便新的和现有的用户能够快速地获得他们需要的东西。您可以使用它来创建独立的Java应用程序,可以使用“Java -jar”或更传统的WAR部署开始。
大约9个月后,2014年4月,Spring Boot 1.0发布了。从那以后,已经有无数次的小发行,给我们带来了一些真正伟大的特性。
-
- spring-boot-starter-test
- Metrics & Health Endpoints
- Elastic Search, Apache Solr, Spring
- Social & Spring Integration Auto-configuration
- Additional Templating support (Adding Freemaker, Groov, and Velocity)
-
- Servlet 3.1, Tomcat 8 & Jetty 9
- Spring 4.1
- @SpringBootApplication Annotation
Email Support
-
Spring Boot 1.3 (December 2016)
- Upgrade to Spring Framework 4.2
- Upgrade to Spring Security 4.0
- Developer Tools
- Caching Auto-configuration
- Fully executable JARs and service support
-
Spring Boot 1.4 (January 2017)
- Spring 4.3
- Hibernate 5
- Testing Improvements
- Integration Starter
- Couchbase and Neo4J Support
-
Spring Boot 1.5 (February 2017)
- Loggers endpoint
- Apache Kafka support
- Cloud Foundry actuator extensions
- LDAP support
- Testing updates
Spring 有什么新内容
Spring Boot 2的新产品是什么?如果我们要讨论最大的特性,我们需要从升级到Spring Framework 5开始。虽然Spring Framework 5自2017年9月就已经发布了,但大多数开发人员(像我一样)一直在等待Spring Boot 2的发布。Spring Framework 5引入了一长串的新特性,但我只是想介绍一下这里的几个主要功能。
在Spring Framework 5中有什么新内容!
Java 8+ 最低要求
如果您希望构建Spring框架应用程序,那么您必须至少使用Java 8。你的第一个想法可能是,这对我们所有人来说都是一个巨大的改变,但实际上它对Spring团队来说是一个更大的变化。这给了他们一个机会来进行一些重大的更改,以更新代码库,以更新Java 8中的所有新特性,如Lambdas和streams。这不仅在整个代码中具有可读性,而且还对框架的核心提供了一些性能改进。
支持 Java9
如果您想使用Java 9,您需要更新Spring Framework 5,因此需要更新Spring Boot 2。我知道我们很多人可能不会在生产中使用最新的和最伟大的Java版本,但是这是一个很好的机会,让你可以玩所有的酷新玩具。使用标准的类路径可以很好地完成这个工作,但是我已经读过一些人在迁移到Java 9模块时遇到的问题。
Spring MVC
虽然Spring MVC并不是这个故事的主要角色,但是有一些很好的升级。我不会在这里一一讲解这些内容,因此,我将介绍 Spring Framework 5的文档.
Spring WebFlux
在Spring Framework 5的故事中,反应堆栈(reactive stack)是我们的主要角色。这是一种不同的思考方式,但对我们来说幸运的是,我们不需要学习一种全新的编程方式。Spring WebFlux是一种完全异步和非阻塞的web框架,它可以让我们处理大量并发连接。这是一个完全的新的范例转换,并且我们可以很容易的开始。
reactive_stack.png
支持Kotlin
Kotlin支持被添加到http://start.spring.io但是在Spring Framework 5中有专门的语言支持。有了专门的支持,您可以在这里看到一些不错的特性。 read about here.
测试改进
测试环境的最大变化是对JUnit 5JUnit 5的Jupiter编程和扩展模型的完全支持。稍后我将再次提到这一点,但是当您启动一个新的Spring Boot 2应用程序时,您仍然使用JUnit 4,但是如果您想开始使用JUnit 5,那么它是一个简单的更改。
在Spring Boot 2中有什么新东西!
第三方库的升级
随着Spring Boot的任何新版本的发布,Spring团队有机会更新各种依赖关系。
- Thymeleaf 3 *
- Jetty 9.4
- Tomcat 8.5
- Hibernate 5.2
- Flyway 5
- Gradle 4
- Thymeleaf启动器现在包括了Thymeleaf -extras-java8time out of The box。
Reactive Spring Data & Spring Security
随着Spring WebFlux的发展,Spring数据也为反应性应用提供了支持。目前,Cassandra、MongoDB、Couchbase和Redis都有活性API支持。Spring Boot包含了所有这些应该让开始变得非常简单的starter- pom。
我们还获得了在反应性应用程序中使用Spring Security 5.0的能力。当Spring Security在类路径上时,自动配置为WebFlux应用程序提供。
Actuator
Spring引导驱动器并不是什么新东西,但是它已经从头开始重写了。如果您不熟悉执行器项目,它会自动公开端点,以获取关于应用程序状态的信息。在Spring Boot 1.x中的执行器是针对servlet API编写的,并且伴随着新的反应式堆栈,Spring团队需要一个能够同时处理这两个问题的解决方案。与此同时,执行器有许多变化:
- Redesign for both servlet & reactive
- Status & health (all the details) were separated out
- Simplified Security model
- Move to micrometer (think SLF4J but for metrics)
- Improved JSON Structures
- Simplified process for creating User-Defined Endpoints.
- @Endpoint
- @WebEndpoint
- @JmxEndpoint
有一个专门的关于Spring Boot Actuator Web API端点的详细文档,这是一个很好的起点。Spring Boot Actuator Web API端点的详细文档 and this is a great place to start.
Gradle Plugin
我一直都是Gradle的忠实粉丝,我很高兴看到团队利用这个机会重写了Gradle插件。
Spring Boot Gradle插件在Gradle中提供了Spring引导支持,允许您打包可执行jar或war归档,运行Spring引导应用程序,并使用Spring - Boot依赖项提供的依赖项管理。Spring Boot的Gradle插件需要Gradle 4.0或更高版本。
Getting Started
要开始使用插件,它需要应用到您的项目中。
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'
构建可执行的jars和wars
bootRepackage任务已经替换为bootJar和bootWar任务,分别用于构建可执行的jar和war。这两项任务都扩展了它们的等效标准Gradle jar或war任务,使您能够访问所有通常的配置选项和行为。
依赖管理
Spring Boot的Gradle插件不再自动应用依赖管理插件。相反,Spring Boot的插件现在会对依赖管理插件进行响应,导入正确版本的Spring - Boot依赖BOM。这使您能够更好地控制如何以及何时配置依赖关系管理。对于大多数应用程序来说,应用依赖管理插件是足够的:
apply plugin: 'io.spring.dependency-management'
Gradle插件也有自己的文档,里面有一些非常棒的信息。任何想要开始使用Gradle的人都应该从下面的链接开始。Gradle Plugin also has its own documentation
简化安全
在Spring Boot 2.x中,主要的目标之一是简化安全配置,使添加自定义安全性变得容易。默认情况下,一切都是安全的,包括静态资源和执行器端点。如果SSpring Security位于类路径上,Spring Boot将添加@EnableWebSecurity
,并依赖Spring Security的 content-negoation来决定使用哪种身份验证机制。
一旦用户决定要添加自定义安全性,Spring Boot提供的默认安全配置将完全退出。此时,用户需要显式地定义他们想要保护的所有的东西。这意味着现在安全配置在一个地方,避免与现有WebSecurityConfigurerAdapters任何类型的排序问题。
下面是一个自定义security的例子:
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 and /info 断点不需要认证.
- 所有其他应用程序端点都受ACTUATOR角色的保护。
- 公共静态资源位置对所有人开放.
- 所有其他应用程序端点都受用户USER的保护。
Actuator Security
随着执行器端点被锁定,您将需要包含或排除您希望看到的端点。这些是现在控制的属性,从1.x开始变化。
端点WEB配置(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.
如果您不确定使用什么属性,多看看常用的应用程序属性文档。common application properties documentation.
支持 HTTP/2
很难相信,但是HTTP 1.1规范是在1996年发布的。我认为这是毋庸置疑的,但是今天的网络是非常不同的。如果您希望在Spring MVC或WebFlux应用程序中启用HTTP/2,可以使用以下属性。
server.http2.enabled=true
这种支持取决于所选的web服务器和应用程序环境,因为该协议不受JDK8的支持。请查看文档以了解更多细节 for more details.
Configuration Properties
在Spring Boot 1.x中。这种轻松绑定的概念得到了支持,这意味着有多种方法可以创建属性名称(驼峰、下划线、连字符),并且该属性将绑定到相同的属性。
这仍然是一样的,但是他们获取的方式是在你自己的代码中读取变量的方式。@Value注释是一个核心容器特性,它不提供与类型安全配置属性相同的特性。
Metrics
Spring Boot自己的指标已被Micrometer
取代。 Pivotal正在开发这项服务,并迅速在Pivotal内部的项目中被采用。
Spring Boot Actuator为Micrometer提供依赖管理和自动配置,Micrometer是一个支持众多监控系统的应用指标外观,其中包括:
- Atlas
- Datadog
- Ganglia
- Graphite
- Influx
- JMX
- New Relic
- Prometheus
- SignalFx
- Simple (in-memory)
- StatsD
-
Wavefront
想要学习更多关于Micrometer 浏览 https://micrometer.io/
这可能会给那些大量记录自定义度量的人带来一点升级的痛苦。
Quartz Scheduler
Spring Boot 2提供了对Quartz Scheduler的支持,它可以通过Spring - Boot -starter- Quartz专用启动器使用。内存和JDBC存储都可以配置。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
HikariCP Connection Pool
默认连接池已从Tomcat切换到HikariCP。 如果您使用spring.datasource.type强制在基于Tomcat的应用程序中使用Hikari,则现在可以删除该重写。 同样,如果您想要保留Tomcat连接池,只需将以下内容添加到您的配置中即可:
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
Developer Tools
默认情况下,每次应用程序重新启动时,都会记录显示状态评估增量的报告。报告显示了在进行更改(如添加或删除bean和设置配置属性)时对应用程序的自动配置的更改。
若要禁用报告的日志记录,请设置以下属性:
spring.devtools.restart.log-condition-evaluation-delta=false
Kotlin Support
我们在之前讨论过Kotlin 这里是相关的文档 documentation to Kotlin.
JUnit 5
正如我前面所说的,Spring引导应用程序的默认值仍然是使用JUnit 4\。如果您想切换到JUnit 5,您将需要从spring引导启动器测试中排除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 Migration Guide
这可能是不言而喻的,但是像这样的任何主要版本,仅仅是在生产中翻转版本号并不是最好的升级路径。我要做的第一件事是阅读Spring Boot 2.0 Migration Guide。对我来说,我发现我的大部分问题都围绕着简化的安全模型变更和属性变更。迁移指南包含了迁移您的属性文件的一个很棒的技巧。
使用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>
我不确定你的想法是什么,但是我肯定会开始使用Spring Boot 2并开始将代码迁移到它,但是对于任何主要版本,我通常都会等到下一个版本发布。 这不仅仅是为了Spring,我从苹果,Pivotal到愤怒的小鸟,都能做到这一点!
Resources
Documentation
这里有大量的资源,但我想从文档开始。Spring框架和Spring Boot的文档多年来确实得到了改进。我喜欢一些专门的指南,我们这一次用Actuator和Gradle插件。
- Spring Boot Reference Guide: https://docs.spring.io/spring-boot/docs/2.0.x/reference/html/
- Spring Boot API: https://docs.spring.io/spring-boot/docs/2.0.x/api/
- Spring Boot Actuator Web API: https://docs.spring.io/spring-boot/docs/2.0.x/actuator-api/html/
- Spring Boot Gradle Plugin Reference: https://docs.spring.io/spring-boot/docs/2.0.x/gradle-plugin/reference/html/
- Spring Boot Maven Plugin Reference: https://docs.spring.io/spring-boot/docs/2.0.x/maven-plugin/
- Common Application Properties: https://docs.spring.io/spring-boot/docs/2.0.x/reference/html/common-application-properties.html
Conclusion
我期待这个版本已经很长时间了,很兴奋他的正式发布。