这部分被面试官问到了,各个版本差异。
Spring Boot基本上是Spring框架的扩展,它消除了设置Spring应用程序所需的XML配置,为更快,更高效的开发生态系统铺平了道路。以下是Spring Boot中的一些特点:
1:创建独立的spring应用。
2:嵌入Tomcat, Jetty Undertow 而且不需要部署他们。
3:提供的“starters” poms来简化Maven配置
4:尽可能自动配置spring应用。
5:提供生产指标,健壮检查和外部化配置
6:绝对没有代码生成和XML配置要求
springboot1.0和springboot2.0
1.WebMvcConfigurerAdapter这个抽象类已经过时。因为SpringBoot的 2.0 及其以上版本最低支持Java 8,而Java 8 中有个新特性就是default关键字。
因为Java8里面对于接口可以写默认方法所以对WebMvcConfigurerAdapter的上层接口WebMvcConfigurer进行了改进,将里面的所以方法改成了默认方法,但无实现。我们可以直接继承WebMvcConfigurer 接口然后实现他的default方法即可。
WebMvcConfigurerAdapter 可以用 WebMvcConfigurationSupport 替代,但是不推荐使用WebMvcConfigurationSupport这个类会全面接管对SpringMVC的配置,即SpringBoot对SpringMVC的自动配置全部失效,只使用用户对SpringMVC的配置。
2.SpringBoot1.X 配置的拦截器对静态资源是默认放行的,而SpringBoot 2.X版本的拦截器不会对静态资源默认放行,也会进行拦截。如果想要使用静态资源就必须排除静态资源的请求路径。
springboot2.1
1.优化应用程序启动速度,启动时占用的内存更少。在Spring Data JPA中设置spring.data. JPA . repositori.bootstrap .bootstrap-mode=deferred时,Hibernate将在单独的线程启动,而应用程序的其余组件将会并行启动。
2.支持Java11并且兼容Java8。
3.提供了应用程序缓存管理信息和提供Spring集成组件的图表信息。
springboot2.2
1.Spring Boot 2.2.0 的性能获得了很大的提升。现在,应用程序启动速度更快,并且消耗的内存更少。这在具有非常严格的内存约束的环境中特别有用。
2.现在可以通过 spring.main.lazy-initialization 属性启用全局延迟初始化,以减少启动时间。但是在进行任何延迟的初始化时,HTTP 请求的处理可能需要更长的时间;通常在启动时会发生的故障现在在启动后才会出现。
3.支持 Java 13,同时仍与 Java 11 和 8 兼容
4.配置属性现在支持基于构造函数的绑定,该绑定使 @ConfigurationProperties 注释的类不可变。可以通过使用 @ConstructorBinding 注释 @ConfigurationProperties 类或其构造函数之一来启用基于构造函数的绑定。可以在配置属性绑定提供的构造函数参数上使用 @DefaultValue 和 @DateTimeFormat 之类的注释。
springboot2.3
1.正常(优雅)停机
什么是正常(优雅)停机?
所有四个嵌入式Web服务器(Jetty,Reactor Netty,Tomcat和Undertow)以及响应式和基于Servlet的Web应用程序均支持正常关机。它作为关闭应用程序上下文的一部分发生,并在停止SmartLifecyclebean 的最早阶段执行。此停止处理使用一个超时,该超时提供一个宽限期,在此宽限期内,现有请求将被允许完成,但新请求将不被允许。不允许新请求的确切方式因所使用的Web服务器而异。Jetty,Reactor Netty和Tomcat将停止在网络层接受请求。Undertow将接受请求,但会立即以服务不可用(503)响应进行响应。
当我们流量请求到此接口执行业务逻辑的时候,若服务端此时执行关机 (kill),spring boot 默认情况会直接关闭容器(tomcat 等),导致此业务逻辑执行失败。在一些业务场景下:会出现数据不一致的情况,事务逻辑不会回滚。使用Tomcat正常关机需要Tomcat 9.0.33或更高版本。
2.分成jar包
重新打包的jar 分别在BOOT-INF/classes
和中包含应用程序的类和依赖项BOOT-INF/lib
。对于需要从jar的内容中构建docker映像的情况,能够进一步分隔这些目录,以便可以将它们写入不同的层是很有用的。
Buildpacks 打镜像包会使用缓存的,如果这一层没变那就不用重新打这一层,只需要重新打包修改过的层,这样一来,如果你只修改了 application 中的内容,比如新加了 Controller 或者配置文件等,那么只需要重新打包这一层,也就是几 K,几十K 不会很大,这样一来打包速度就很快了,要不然一个上百兆的镜像包也得需要一段时间。
springboot2.4
1.自动分析瘦身
Spring Boot 项目最终构建处理 JAR 包大小一直是个诟病,需要把所有依赖包内置最终输出可运行的 jar。 当然可以使用其他的插件扩展 实现依赖 JAR 和 可运行 jar 分离可以参考 slot-maven-plugin, 但此种方法治标不治本并不能减少原有依赖的 JAR 的大小。
Spring Boot 2.4 提供对构建输出 JAR 分析自动瘦身的功能,自动在构建输出可运行 JAR 时删除 empty starter dependencies。