Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。
~
本篇内容包括:Spring Boot 概述、Spring Boot 约定优于配置、Spring Boot 演进之路
文章目录
- 一、Spring Boot 概述
- 1、Spring Boot 简介
- 2、Spring Boot 特点
- 3、Spring Boot 优点
- 4、Spring Boot 缺点
- 二、Spring Boot 约定优于配置
- 1、对于“约定优于配置”的理解
- 2、对于“约定优于配置”的体现
- 三、Spring Boot 演进之路
- 1、Spring Boot 1.0 和 2.0
- 2、Spring Boot 2.1
- 3、Spring Boot 2.2
- 4、Spring Boot 2.3
- 5、Spring Boot 2.4
- ...
- 6、Spring Boot 3.0
一、Spring Boot 概述
1、Spring Boot 简介
Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。
官方网站:http://projects.spring.io/spring-boot/
GitHub源码:https://github.com/spring-projects/spring-boot
2、Spring Boot 特点
为基于 Spring 的开发提供更快的入门体验开箱即用,没有代码生成,也无需 xml 配置。同时也可以修改默认值来满足特定的需求。
提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等 SpringBoot 不是对 Spring 功能上的增强,而是提供了一种快速使用 Spring 的方式。
3、Spring Boot 优点
Spring Boot 优点如下:
- 独立运行:Spring Boot 而且内嵌了各种 Servlet 容器,Tomcat、Jetty等,现在不再需要打成 war 包部署到容器中,Spring Boot 只要打成一个可执行的 jar 包就能独立运行,所有的依赖包都在一个 jar 包内。
- 简化部署:spring-boot-starter-web 启动器自动依赖其他组件,简少了 Maven 的配置。
- 自动配置:Spring Boot 能根据当前类路径下的类、jar 包来自动配置 bean,如添加一个 ‘spring-boot-starter-web’ 启动器就能拥有 web 的功能,无需其他配置。
- 无代码生成及 xml 配置:Spring Boot 配置过程中无代码生成,也无需 xml 配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的,这也是 Spring4.x 的核心功能之一。
- 应用监控:Spring Boot 提供一系列端点可以监控服务及应用,做健康检测。
4、Spring Boot 缺点
Spring Boot 缺点如下:
Spring Boot 虽然上手很容易,但如果你不了解其核心技术及流程,所以一旦遇到问题就很棘手,而且现在的解决方案也不是很多,需要一个完善的过程。
二、Spring Boot 约定优于配置
1、对于“约定优于配置”的理解
约定优于配置(convention over configuration),也称作按约定编程,是一种软件设计范式,旨在减少软件开发人员需做出决定的数量,活得简单的好处,而又不失灵活性。开发人员仅仅需要规定应用中不符合约定的部分。
- 约定大于配置,约定好于配置,习惯大于配置等。但它们都表明了一个意思,并不是说零配置。或者说零配置并不是完全没有配置,而是通过约定来减少配置;
- 系统,类库,框架应该提供有合理的默认值,而非要求提供不必要的配置。使用该框架提供的默认值,会让开发人员工作起来效率更快。
Ps:Spring 在推动 约定优于配置 这一设计理念,从 Spring 的注解版本就已经开始了。引入注解就是为了减少一些默认配置,引入注解也就代表着简化配置的开始,官方说基于 Spring 的基础就是这个事实。
2、对于“约定优于配置”的体现
在我们真实去使用 Spring Boot 进行开发时,就能深刻体会到其中“约定优于配置”的这一特点。往往是我们引入一个组件依赖,加个配置,这个组件就生效了,非常便利。
比如我们常用的 Redis, 在 Spring Boot 中就是这样使用的:
# 引入 Maven 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
# 配置 .yml 文件
spring:
redis:
host: localhost
port: 6379
password: pwd1234
# 使用 Redis
@Autowired
private RedisTemplate redisTemplate;
可以看到就这样简单两步,中间没有做任何事情,就可以搞定 Redis 的引入(Ps:关于 Spring Boot 是如何做到这一点的,会在后面介绍)
三、Spring Boot 演进之路
1、Spring Boot 1.0 和 2.0
-
从 2.0 版本开始 WebMvcConfigurerAdapter 抽象类已经过时。直接继承 WebMvcConfigurer 接口然后实现他的 default 方法即可。因为 SpringBoo t的 2.0 及其以上版本最低支持Java 8,而 Java 8 中有个新特性就是 default 关键字。
WebMvcConfigurerAdapter 可以用 WebMvcConfigurationSupport 替代,但是不推荐使用 WebMvcConfigurationSupport 这个类会全面接管对 SpringMVC 的配置,即SpringBoot 对 SpringMVC 的自动配置全部失效,只使用用户对 SpringMVC的 配置。
-
SpringBoot1.X 配置的拦截器对静态资源是默认放行的,而 SpringBoot 2.X 版本的拦截器不会对静态资源默认放行,也会进行拦截。如果想要使用静态资源就必须排除静态资源的请求路径。
2、Spring Boot 2.1
- 优化应用程序启动速度,启动时占用的内存更少。在 Spring Data JPA 中设置 spring.data.JPA.repositori.bootstrap.bootstrap-mode=deferred 时,Hibernate 将在单独的线程启动,而应用程序的其余组件将会并行启动。
- 支持 Java11 并且兼容Java8。
- 提供了应用程序缓存管理信息和提供Spring集成组件的图表信息。
3、Spring Boot 2.2
- Spring Boot 2.2.0 的性能获得了很大的提升。现在,应用程序启动速度更快,并且消耗的内存更少。这在具有非常严格的内存约束的环境中特别有用。
- 现在可以通过 spring.main.lazy-initialization 属性启用全局延迟初始化,以减少启动时间。但是在进行任何延迟的初始化时,HTTP 请求的处理可能需要更长的时间;通常在启动时会发生的故障现在在启动后才会出现。
- 支持 Java 13,同时仍与 Java 11 和 8 兼容
- 配置属性现在支持基于构造函数的绑定,该绑定使 @ConfigurationProperties 注释的类不可变。可以通过使用 @ConstructorBinding 注释 @ConfigurationProperties 类或其构造函数之一来启用基于构造函数的绑定。可以在配置属性绑定提供的构造函数参数上使用 @DefaultValue 和 @DateTimeFormat 之类的注释。
4、Spring Boot 2.3
# 正常(优雅)停机
所有四个嵌入式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或更高版本。
# 分成 jar 包
重新打包的 jar 分别在 BOOT-INF/classes 和中包含应用程序的类和依赖项 BOOT-INF/lib。对于需要从 jar 的内容中构建 docker 映像的情况,能够进一步分隔这些目录,以便可以将它们写入不同的层是很有用的。
Buildpacks 打镜像包会使用缓存的,如果这一层没变那就不用重新打这一层,只需要重新打包修改过的层,这样一来,如果你只修改了 application 中的内容,比如新加了 Controller 或者配置文件等,那么只需要重新打包这一层,也就是几 K,几十 K 不会很大,这样一来打包速度就很快了,要不然一个上百兆的镜像包也得需要一段时间。
5、Spring Boot 2.4
# 自动分析瘦身
Spring Boot 项目最终构建处理 JAR 包大小一直是个诟病,需要把所有依赖包内置最终输出可运行的 jar。 当然可以使用其他的插件扩展 实现依赖 JAR 和 可运行 jar 分离可以参考 slot-maven-plugin, 但此种方法治标不治本并不能减少原有依赖的 JAR 的大小。
Spring Boot 2.4 提供对构建输出 JAR 分析自动瘦身的功能,自动在构建输出可运行 JAR 时删除 empty starter dependencies。
…
6、Spring Boot 3.0
Spring Boot 3 最大的变化是决定使用 Java 17 作为最低版本。要求 Java 17 和更新版本是一个重大举措,Spring 将成为第一个需要此最新 LTS 版本的主要框架。
Spring Boot 3 还需要 Spring Framework 6。对于 Gradle 用户,Spring Boot 3 需要 Gradle 7.3 或更高版本。
其余值得注意的依赖升级可以分为两组,Spring 项目和第三方库。