在Spring Boot 2中有什么新内容?

在Spring Boot 2中有什么新内容?_第1张图片

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 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框架,它可以让我们处理大量并发连接。这是一个完全的新的范例转换,并且我们可以很容易的开始。


在Spring Boot 2中有什么新内容?_第2张图片
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是一个支持众多监控系统的应用指标外观,其中包括:

  • Atlas
  • Datadog
  • Ganglia
  • Graphite
  • Influx
  • JMX
  • New Relic
  • Prometheus
  • SignalFx
  • Simple (in-memory)
  • StatsD
  • Wavefront
    在Spring Boot 2中有什么新内容?_第3张图片

想要学习更多关于Micrometer 浏览 https://micrometer.io/

这可能会给那些大量记录自定义度量的人带来一点升级的痛苦。

Quartz Scheduler

Spring Boot 2提供了对Quartz Scheduler的支持,它可以通过Spring - Boot -starter- Quartz专用启动器使用。内存和JDBC存储都可以配置。



    org.springframework.boot
    spring-boot-starter-quartz


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,并添加所需的依赖项。您还需要添加下面列出的插件。


    
        org.springframework.boot
        spring-boot-starter-test
        test
        
            
                junit
                junit
            
        
    
    
        org.junit.jupiter
        junit-jupiter-api
    test
    
    
        org.junit.jupiter
        junit-jupiter-engine
        test
    


    
        
            org.springframework.boot
            spring-boot-maven-plugin
        
        
org.apache.maven.plugins
            maven-surefire-plugin
            
                
                    org.junit.platform
                    junit-platform-surefire-provider
                    ${junit-platform.version}
                
            
        
    


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模块。 一旦作为依赖添加到项目中,这不仅将分析应用程序的环境并在启动时打印诊断信息,而且还会在运行时为您暂时迁移属性。 这是您的应用程序迁移期间必须具备的条件:


 org.springframework.boot
 spring-boot-properties-migrator

我不确定你的想法是什么,但是我肯定会开始使用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

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

原文链接

你可能感兴趣的:(在Spring Boot 2中有什么新内容?)