在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 1.1 (June 2014)

    • 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)
  • Spring Boot 1.2 (March 2015)

    • Servlet 3.1, Tomcat 8 & Jetty 9
    • Spring 4.1
    • @SpringBootApplication Annotation
      Email Support

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
  1. /status and /info 断点不需要认证.
  2. 所有其他应用程序端点都受ACTUATOR角色的保护。
  3. 公共静态资源位置对所有人开放.
  4. 所有其他应用程序端点都受用户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注释是一个核心容器特性,它不提供与类型安全配置属性相同的特性。

https://docs.spring.io/spring-boot/docs/2.0.x/reference/html/boot-features-external-config.html#boot-features-external-config-relaxed-binding

Metrics

Spring Boot自己的指标已被Micrometer
取代。 Pivotal正在开发这项服务,并迅速在Pivotal内部的项目中被采用。

Spring Boot Actuator为Micrometer提供依赖管理和自动配置,Micrometer是一个支持众多监控系统的应用指标外观,其中包括:

想要学习更多关于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插件。

Conclusion

我期待这个版本已经很长时间了,很兴奋他的正式发布。

原文链接

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容