Spring Boot 2

小豆丁 2月前 ⋅ 121 阅读

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插件。





注意:本文归作者所有,未经作者允许,不得转载

全部评论: 0

    我有话说: