Spring Boot 2.2中有什么新功能? - oio


Spring Boot 2.2最近已发布,并具有一系列新功能。在相当数量的Spring项目的依赖项升级中,Spring Boot 2.2中的其他更改如下:

  • 支持Java 13
  • JUnit 5
  • Jakarta EE依赖项
  • 延迟初始化
  • RSocket支持
  • Hibernate 方言
  • Kubernetes检测
  • 以及其他类似项:运行状况指示器组,AssertJ 3.12,Spring HATEOAS 1.0,DataSize迁移,Elasticsearch,执行器HTTP跟踪和审核,Gradle要求,Jetty日志记录配置,Hamcrest 2.1,Freemarker模板配置,默认情况下禁用HttpHiddenMethodFilter,运行状况指示器,测试应用程序参数,Banner...

Deprecations弃用
首先,我想提醒您注意Spring Boot 2.1中引入的弃用,这些弃用已在新版本(2.2)中完全删除。因此,如果要从旧版本迁移,则必须摆脱项目中使用的所有不推荐使用的方法。
您可以通过访问Spring docs网页搜索类,方法,接口和其他不赞成使用的内容的列表来找到更多信息。(例如:https : //docs.spring.io/spring-boot/docs/current/api/deprecated-list.html

Java 13支持
Spring Boot有趣的部分是它不仅支持Java 8和11,而且还与最近(截至2019年9月17日)发布的新Java 13版本兼容。

JUnit 5
功能丰富的单元测试库JUnit 5已作为默认支持添加到Spring Boot 2.2 Starter Application。这意味着JUnit 5是默认的测试库依赖项。
为了运行测试,应使用以下包装程序:

  • Maven包装器: ./mvnw clean test
  • 摇篮包装器: ./gradlew clean test

如果访问Spring Boot入门页面http://start.spring.io并生成一个项目,则会发现创建的项目包含JUnit 5的所有必需依赖项。
此外,如果您仍在使用JUnit 4并想迁移到新的Spring Boot版本,则不必担心或将所有内容迁移到JUnit 5,因为JUnit 5的引擎支持现有的JUnit 4测试类。
假设您将Maven与JUnit 4的Maven Surefire插件一起使用,则需要考虑一些因素,例如listener属性。例如,您可以参考Spring Boot 2.2发行说明
要考虑的另一个关键点是创建Spring Boot测试。首先,您可以使用在随机端口上运行的Web服务器(@LocalServerPort)或使用具有模拟依赖项(@MockBean)在随机端口上运行的Web服务器)创建Spring Boot测试;其次,您可以使用以下注释的创建一个Mock模拟层:@AutoConfigureMockMvc.

Spring Boot 2.2的其他测试依赖项升级是AssertJ 3.13.2,Hamcrest 2.1和Mockito 3.1.0。

Jakarta EE依赖项
如果您还没有听说过Jakarta EE,那就不用担心。Jakarta EE是Java Enterprise Edition的规范。Jakarta EE是Java专注于云计算的关键。如果您对此主题感兴趣,可以阅读https://www.eclipse.org新闻通讯中的文章。
回到我们的主题,在Spring Boot 2.2中,一些依赖项已从Java EE移至Jakarta EE依赖项:   

  • javax group ID -> jakarta group ID

请注意,您现在应该移至Jakarta EE API依赖性,因为最终将消除Java EE API依赖性。

延迟初始化
为了启用延迟初始化,Spring Boot 2.2中引入了一个新属性。在较旧的版本中也可以这样做,但是启用延迟初始化的过程非常困难,因为您需要编写BeanFactoryPostProcessor。在Spring Boot 2.2中,您可以通过将其设置spring.main.lazy-initialization为true 来启用它。
它的优点是减少了启动时间,因为在应用程序启动期间加载了更少的类并创建了更少的bean。
如果您想知道为什么我没有提到Spring Boot的DevTools,那么答案就是:Spring Boot已经包含DevTools,可以帮助您提高生产率。DevTools不会在每次进行新更改时都重新启动JVM和应用程序,而是在同一JVM实例中使用热重新启动。即使重新启动后原始时间减少了80%,使用spring.main.lazy-initialization它时甚至可以减少更多,直接在IDE中减少了64%。

​​​​​​但是为什么默认情况下不启用它?
这会产生一些在启动时就应该指出的问题,因为有些类将不再加载,或者直到必要时才创建bean。产生的错误应包括:

  • NoClassDefFoundError
  • OutOfMemoryError
  • 因配置错误而导致的故障

为了启用延迟初始化,必须将以下行添加到配置文件:
spring.main.lazy-initialization=true
这适用于所有bean。
如果除一个(或多个)以外的所有bean需要此配置,则可以使用:@Lazy(false)。此外,如果需要使用延迟初始化配置一个特定的bean,@Lazy则应使用注释。

如果使用@Lazy注释了一个类,则意味着所有使用注释的方法@Bean 都是惰性的。例如,在下面的示例中,将仅延迟加载地址getAddress()。

@Lazy
@Configuration
public class HelloWorld {
 
    @Bean
    public Address getAddress() {
        return new Address();
    }
 
    public Name getName() {
        return new Name();
    }
 
    public Company getCompany() {
        return new Company();
    }
}

如果@Lazy从类中除去,并将其添加到@Bean声明中,则意味着延迟加载仅影响该特定的bean。

@Configuration
public class HelloWorld {
 
    @Bean
    @Lazy(true)
    public Address getAddress() {
        return new Address();
    }
 
    public Name getName() {
        return new Name();
    }
}

Kubernetes检测
Kubernetes是Google提供的开源容器管理工具。
值得注意的是,通过在类上使用@ConditionalOnCloudPlatform,您可以检查应用程序是否在Kubernetes上运行。

@ConditionalOnCloudPlatform(CloudPlatform.KUBERNETES)
public class DemoApplication {
    //…
}

其他新功能和性能改进包括以下:
配置属性现在支持基于构造函数的绑定,对运行状况指示器进行分组的能力以及Spring Boot的RSocket实现的广泛的自配置。
RSocket是提供反应式流语义的应用程序协议。
spring-boot-starter-rsocket现在是Spring Boot启动程序的一部分。

考虑到所有因素,我认为您绝对应该尝试Spring Boot 2.2以便更舒适地编写代码。