Springboot 核心技术
基础入门
1、Spring 生态圈
Spring 官网:https://spring.io
Spring 能做什么?
Spring 的生态:
- web 开发
- 数据访问
- 安全控制
- 分布式
- 消息服务
- 移动开发
- 批处理
- …
2、为什么使用 SpringBoot?
Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”.
能快速创建出生产级别的 Spring 应用。
SpringBoot 的优点:
- 创建独立 Spring 应用
- 内嵌 web 服务器
- 自动 starter 依赖,简化构建配置
- 自动配置 Spring 以及第三方功能
- 提供生产级别的监控、健康检查及外部化配置
- 无代码生成、无需编写 XML
- SpringBoot 是整合 Spring 技术栈的一站式框架
- SpringBoot 是简化 Spring 技术栈的快速开发脚手架
SpringBoot 的缺点:
- 人称版本帝,社区活跃,迭代快,需要时刻关注版本变化
- 封装太深,内部原理复杂,不容易精通
3、时代背景
SpringBoot 诞生的时代背景,为了解决什么样的应用场景?
3.1、微服务
James Lewis and Martin Fowler (2014) 提出微服务完整概念。
In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.– James Lewis and Martin Fowler (2014)
主要提出:
- 微服务是一种架构风格
- 一个应用拆分为一组小型服务
- 每个服务运行在自己的进程内,也就是可独立部署和升级
- 服务之间使用轻量级 HTTP 交互
- 服务围绕业务功能拆分
- 可以由全自动部署机制独立部署
- 去中心化,服务自治。服务可以使用不同的语言、不同的存储技术
3.2、分布式
分布式架构,讲得是系统服务分布在多个物理隔离的节点上运行,统一对外提供服务。从用户层面来看,就是一组服务节点组成一个系统。
分布式有哪些困难:
- 远程调用
- 服务发现
- 负载均衡
- 服务容错
- 配置管理
- 服务监控
- 链路追踪
- 日志管理
- 任务调度
- …
分布式的解决方案:
==SpringBoot + SpringCloud==
4、如何学习 SpringBoot?
官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/
版本更新日志:https://github.com/spring-projects/spring-boot/wiki#release-notes
5、SpringBoot 特点
首先快速搭建一个SpringBoot
应用
5.1、准备工作
系统要求
- Java 8 & 兼容 java14 .
- Maven 3.3+
- idea 2022.1
maven 设置
1 | XML |
创建一个 maven 项目
- 创建工程
过程略,使用 idea 创建即可
- 引入依赖
1 | XML |
- 创建主程序
1 | JAVA |
- 编写接口
1 | JAVA |
- 简化配置
1 | application.properties |
- 测试
运行启动类中的 main 方法,访问接口测试:localhost:8888/hello
5.2、依赖管理
- 父项目做依赖管理
1 | XML |
- 开发导入 starter 场景启动器
官方支持的的 starter 列表:Spring Boot Starters
spring-boot-starter-*
:这个 *
代表的就是某种场景,引入场景启动器可以帮助我们简化开发,依赖管理
第三方场景启动器:*-spring-boot-starter
1 | XML |
- 无需关注版本号,自动根据场景启动器版本仲裁(父项目)
- 引入依赖默认都可以不写版本
- 引入非版本仲裁的 jar,要写版本号。
- 可以修改默认版本号
- 查看 spring-boot-dependencies 里面规定当前依赖的版本 用的 key
- 在当前项目里面重写配置
1 | APACHE |
5.3、自动配置
spring-boot-starter-web
这个场景启动器会帮助我们做好很多配置
自动配置好 Tomcat
- 引入 Tomcat 依赖
- 配置 Tomcat
1
2
3
4
5
6
7XML
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.6.7</version>
<scope>compile</scope>
</dependency>自动配好 SpringMVC
- 引入 SpringMVC 全套组件
- 自动配置好 SpringMVC 常用组件(功能)
自动配好 Web 常用功能,如:字符编码问题
- SpringBoot 帮我们配置好了所有 web 开发的常用场景
默认的包结构
- 主程序所在的包及其下面的所有子包里面的组件都会被扫描进来
- 无需以前的包扫描配置
- 想要改变扫描路径,@SpringBootApplication(scanBasePackages=”com.vansys”)
- 或者使用@ComponentScan 指定扫描路径
1 | LESS |
- 各种配置拥有默认值
- 默认配置最终都是映射到某个类上,如:MultipartProperties
- 配置文件的值最终会绑定在每个类上,这个类会在容器中创建对象
- 按需加载所有自动配置项
- 非常多的 starter
- 引入了哪些场景,相对应的场景才会开启
- SprongBoot 所有的自动配置功能都在 spring-boot-autoconfigure 包里面
- …
6、容器功能
6.1、组件添加
@Configuration
- 基本使用
- Full 模式与 Lite 模式
- 配置类组件之间无依赖关系用 Lite 模式,加速容器的启动过程,减少判断
- 配置类组件之间有依赖关系,方法会被调用得到之前的单实例组件,用 Full 模式
1 | JAVA |
@Bean、@Component、@Controller、@Service、@Repository
在类上使用这些这些注解也可以实现往容器里添加组件
@ComponentScan、@Import
1 | LESS |
@Conditional
条件装配:满足@Conditional 指定的条件,则进行组件注入
@ImportResource
原生配置文件引入,可以引入一个 beans.xml
配置文件
6.2、配置绑定
@Component + @ConfigurationProperties
通过 prefix
匹配 application.properties
核心配置文件的配置,并指定注入到容器中
1 | JAVA |
@EnableConfigurationProperties + @ConfigurationProperties
1 | JAVA |
Spring 注解详解:https://www.bilibili.com/video/BV1gW411W7wy
7、自动配置原理入门
7.1、引导加载自动配置类
1 | JAVA |
SpringBootConfiguration
- @Configuration:表明当前是一个配置类
@ComponentScan
- 指定扫描哪些包下的组件
@EnableAutoConfiguration
1
2
3
4
5
6
7
8
9
10JAVA
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}- @AutoConfigurationPackage
自动配置包?指定了默认的包规则
1
2
3
4
5
6
7
8
9JAVA
//利用Registrar给容器中导入一系列组件
//将指定的一个包下的所有组件导入进来?MainApplication 所在包下。
@Import({AutoConfigurationPackages.Registrar.class})
public @interface AutoConfigurationPackage {
String[] basePackages() default {};
Class<?>[] basePackageClasses() default {};
}- @Import(AutoConfigurationImportSelector.class)
1
2
3
4
5
6
7REASONML
1、利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件
2、调用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类
3、利用工厂加载 Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的组件
4、从META-INF/spring.factories位置来加载一个文件。
默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件
spring-boot-autoconfigure-2.6.7.RELEASE.jar包里面也有META-INF/spring.factories
spring-boot-autoconfigure-2.6.7.RELEASE.jar/META-INF/spring.factories 文件里面写死了 spring-boot 一启动就要给容器中加载的所有配置类
1 | LIVESCRIPT |
7.2、按需开启自动配置项
spring-boot-2.6.7.RELEASE
版本默认提供了 133 个自动配置项,全为 xxxAutoConfiguration
的自动配置类,但是根据 Spring 的 @Conditional
注解,最终会按需配置。
7.3、修改默认配置
1 | JAVA |
==SpringBoot 默认会在底层配好所有的组件。但是如果用户自己配置了以用户的优先==
1 | JAVA |
总结:
- SpringBoot 先加载所有的自动配置类 xxxxxAutoConfiguration
- 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties 里面拿。xxxProperties 和配置文件进行了绑定
- 生效的配置类就会给容器中装配很多组件
- 只要容器中有这些组件,相当于这些功能就有了
- 定制化配置
- 用户直接自己使用@Bean 替换底层的组件
- 用户去看这个组件是获取的配置文件什么值就去修改。
xxxxxAutoConfiguration —> 组件 —>** **xxxxProperties 里面拿值 —-> application.properties
核心功能
1、配置文件
1.1、文件类型
- properties
同以前的 properties 用法
- yaml
YAML 是 YAML Ain't Markup Language
(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:Yet Another Markup Language
(仍是一种标记语言)。
非常适合用来做以数据为中心的配置文件
基本语法
key: value
;kv 之间有空格- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许使用 tab,只允许空格
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
#
表示注释- ‘’ 与 “” 表示字符串内容,会被 转义/不转义
数据类型
- 字面量:单个的、不可再分的值。date、boolean、string、number、null
1 | YAML |
- 对象:键值对的集合。map、hash、set、object
1 | YAML |
- 数组:一组按次序排列的值。array、list、queue
1 | YAML |
示例
1 | JAVA |
1.2、配置提示
==自定义的类和配置文件绑定一般没有提示==
1 | XML |
2、Web 开发
2.1、SpringMVC 自动配置概览
Spring Boot provides auto-configuration for Spring MVC that works well with most applications.(大多场景我们都无需自定义配置)
The auto-configuration adds the following features on top of Spring’s defaults:
- Inclusion of
ContentNegotiatingViewResolver
andBeanNameViewResolver
beans. - 内容协商视图解析器和 BeanName 视图解析器
- Support for serving static resources, including support for WebJars (covered later in this document)).
- 静态资源(包括 webjars)
- Automatic registration of
Converter
,GenericConverter
, andFormatter
beans. - 自动注册
Converter,GenericConverter,Formatter
- 自动注册
- Support for
HttpMessageConverters
(covered later in this document). - 支持
HttpMessageConverters
(后来我们配合内容协商理解原理)
- 支持
- Automatic registration of
MessageCodesResolver
(covered later in this document). - 自动注册
MessageCodesResolver
(国际化用)
- 自动注册
- Static
index.html
support. - 静态 index.html 页支持
- Custom
Favicon
support (covered later in this document). - 自定义
Favicon
- 自定义
- Automatic use of a
ConfigurableWebBindingInitializer
bean (covered later in this document). - 自动使用
ConfigurableWebBindingInitializer
,(DataBinder 负责将请求数据绑定到 JavaBean 上)
- 自动使用
If you want to keep those Spring Boot MVC customizations and make more MVC customizations (interceptors, formatters, view controllers, and other features), you can add your own
@Configuration
class of typeWebMvcConfigurer
but without@EnableWebMvc
.不用@EnableWebMvc 注解。使用
@Configuration**
+WebMvcConfigurer
自定义规则
If you want to provide custom instances of
RequestMappingHandlerMapping
,RequestMappingHandlerAdapter
, orExceptionHandlerExceptionResolver
, and still keep the Spring Boot MVC customizations, you can declare a bean of typeWebMvcRegistrations
and use it to provide custom instances of those components.声明
WebMvcRegistrations
改变默认底层组件
If you want to take complete control of Spring MVC, you can add your own
@Configuration
annotated with@EnableWebMvc
, or alternatively add your own@Configuration
-annotatedDelegatingWebMvcConfiguration
as described in the Javadoc of@EnableWebMvc
.使用 ==@EnableWebMvc+@Configuration+DelegatingWebMvcConfiguration 全面接管 SpringMVC==