Spring Boot 2.2最近已发布,并具有一系列新功能。在相当数量的Spring项目的依赖项升级中,Spring Boot 2.2中的其他更改如下:
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是默认的测试库依赖项。
为了运行测试,应使用以下包装程序:
如果访问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依赖项:
请注意,您现在应该移至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。产生的错误应包括:
为了启用延迟初始化,必须将以下行添加到配置文件:
spring.main.lazy-initialization=true
这适用于所有bean。
如果除一个(或多个)以外的所有bean需要此配置,则可以使用:@Lazy(false)。此外,如果需要使用延迟初始化配置一个特定的bean,@Lazy则应使用注释。
如果使用@Lazy注释了一个类,则意味着所有使用注释的方法@Bean 都是惰性的。例如,在下面的示例中,将仅延迟加载地址getAddress()。
@Lazy @Configuration <b>public</b> <b>class</b> HelloWorld { @Bean <b>public</b> Address getAddress() { <b>return</b> <b>new</b> Address(); } <b>public</b> Name getName() { <b>return</b> <b>new</b> Name(); } <b>public</b> Company getCompany() { <b>return</b> <b>new</b> Company(); } }
如果@Lazy从类中除去,并将其添加到@Bean声明中,则意味着延迟加载仅影响该特定的bean。
@Configuration <b>public</b> <b>class</b> HelloWorld { @Bean @Lazy(<b>true</b>) <b>public</b> Address getAddress() { <b>return</b> <b>new</b> Address(); } <b>public</b> Name getName() { <b>return</b> <b>new</b> Name(); } }
Kubernetes检测
Kubernetes是Google提供的开源容器管理工具。
值得注意的是,通过在类上使用@ConditionalOnCloudPlatform,您可以检查应用程序是否在Kubernetes上运行。
@ConditionalOnCloudPlatform(CloudPlatform.KUBERNETES) <b>public</b> <b>class</b> DemoApplication { <font><i>//…</i></font><font> } </font>
其他新功能和性能改进包括以下:
配置属性现在支持基于构造函数的绑定,对运行状况指示器进行分组的能力以及Spring Boot的RSocket实现的广泛的自配置。
RSocket是提供反应式流语义的应用程序协议。
spring-boot-starter-rsocket现在是Spring Boot启动程序的一部分。
考虑到所有因素,我认为您绝对应该尝试Spring Boot 2.2以便更舒适地编写代码。