SpringBoot3自动配置流程及原理、SpringBootApplication注解详解

news/2024/10/18 9:17:17/

参考尚硅谷课程: https://www.yuque.com/leifengyang/springboot3/vznmdeb4kgn90vrx
https://www.yuque.com/leifengyang/springboot3/lliphvul8b19pqxp

1.自动配置流程及原理

在这里插入图片描述

核心流程总结:
1.导入starter,就会导入autoconfigure包
2.autoconfigure 包里面 有一个文件 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,里面指定的所有启动要加载的自动配置类
3.@EnableAutoConfiguration会自动的把上面文件里面写的所有自动配置类都导入进来。xxxAutoConfiguration 是有条件注解进行按需加载
4.xxxAutoConfiguration给容器中导入一堆组件,组件都是从 xxxProperties中提取属性值
5.xxxProperties又是和配置文件进行了绑定

效果:导入starter、修改配置文件,就能修改底层行为。

一句话总结就是: 导入一个场景,会导入autoconfigure包,autoconfigure包里面的AutoConfiguration.imports文件指定了所有的配置类,这些配置类会被@EnableAutoConfiguration全部导入到容器中,同时各个配置类和各种xxxProperties类进行了绑定,xxxProperties又和配置文件进行了绑定,这样一来,修改配置文件就能修改底层行为。

详细流程: 以导入starter-web为例
1.导入starter-web:导入了web开发场景
1)场景启动器导入了相关场景的所有依赖:starter-json、starter-tomcat、springmvc
2)每个场景启动器都引入了一个spring-boot-starter,核心场景启动器。
3)核心场景启动器引入了spring-boot-autoconfigure包。
4)spring-boot-autoconfigure里面囊括了所有场景的所有配置。
5)只要这个包下的所有类都能生效,那么相当于SpringBoot官方写好的整合功能就生效了。
6)SpringBoot默认却扫描不到 spring-boot-autoconfigure下写好的所有配置类。默认只扫描主程序所在的包。那么这些配置类是怎么被注入到容器中的呢? --> EnableAutoConfiguration:SpringBoot使用@Import将所有的配置类注入到容器中

2.主程序:@SpringBootApplication
1)@SpringBootApplication由三个注解组成@SpringBootConfiguration、@EnableAutoConfiguratio、@ComponentScan
2)SpringBoot默认只能扫描自己主程序所在的包及其下面的子包,扫描不到 spring-boot-autoconfigure包中官方写好的配置类
3)@EnableAutoConfiguration:SpringBoot 开启自动配置的核心。

  1. 是由@Import(AutoConfigurationImportSelector.class)提供功能:批量给容器中导入组件。 --> AutoConfigurationImportSelector类里面写了方法来实现批量导入自动配置类
  2. SpringBoot启动会默认加载 140多个配置类。
  3. 这140多个配置类来自于spring-boot-autoconfigure下 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件指定。项目启动的时候利用 @Import 批量导入组件机制把 autoconfigure 包下的142 xxxxAutoConfiguration类导入进来(自动配置类)

4)虽然导入了142个自动配置类,但是是按需生效:
1)并不是这142个自动配置类都能生效
2)每一个自动配置类,都有条件注解@ConditionalOnxxx,只有条件成立,才能生效

3.xxxxAutoConfiguration自动配置类
1)给容器中使用@Bean放一堆组件。
2)每个自动配置类都可能有这个注解@EnableConfigurationProperties(ServerProperties.class),用来把配置文件中配的指定前缀的属性值封装到xxxProperties属性类中
3)以Tomcat为例:把服务器的所有配置都是以server开头的。配置都封装到了属性类中。
4)给容器中放的所有组件的一些核心参数,都来自于xxxProperties。xxxProperties都是和配置文件绑定。这样一来只需要改配置文件的值,核心组件的底层参数都能修改

4.写业务,全程无需关心各种整合(底层这些整合写好了,而且也生效了)

====
自动配置:全部都配置好,什么都不用管。 自动批量导入 --> 项目一启动,spi文件中指定的所有都加载。

如果想要手动控制哪些功能开启:
可以使用各种@EnableXxxx注解:手动控制哪些功能的开启; 手动导入。
1.开启xxx功能
2.Enablexxx注解都是利用 @Import 把此功能要用的组件导入进去

====
SpringBoot3自动配置机制使用了了java的SPI思想, SPI可以参考: https://blog.csdn.net/u011069294/article/details/134331894
SPI简单粗暴的理解就是: 把各种组件的名字放在一个文件中,用的时候加载进去,然后修改或者添加新的组件就只改这个文件就行

2.@SpringBootApplication注解

@SpringBootApplication注解由@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan这3个注解组成。

1.@SpringBootConfiguration
就是一个 @Configuration 注解,会放入到容器中,是配置类。spring ioc启动就会加载创建这个类对象

2.@EnableAutoConfiguration --> 上面说到的开启自动配置的作用
包含下面两个注解:
1)@AutoConfigurationPackage:扫描主程序包:加载自己的组件

  1. 利用 @Import(AutoConfigurationPackages.Registrar.class) 想要给容器中导入组件。
  2. 把主程序所在的包的所有组件导入进来
  3. 为什么SpringBoot默认只扫描主程序所在的包及其子包? --> 因为AutoConfigurationPackages代码里面写了
    static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {Registrar() {}public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {//这句代码会加载主程序所在的包及其子包里面的类到容器中AutoConfigurationPackages.register(registry, (String[])(new PackageImports(metadata)).getPackageNames().toArray(new String[0]));}public Set<Object> determineImports(AnnotationMetadata metadata) {return Collections.singleton(new PackageImports(metadata));}}

2)@Import(AutoConfigurationImportSelector.class):加载所有自动配置类:加载starter导入的组件
对应的代码:

	List<String> configurations = ImportCandidates.load(AutoConfiguration.class, getBeanClassLoader()).getCandidates();

扫描SPI文件:META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

3.@ComponentScan
组件扫描:排除一些组件(哪些不要)
主要是排除前面已经扫描进来的配置类、和自动配置类。

对应的代码:

@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })

====
一句话总结: @SpringBootApplication注解由@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan这3个注解组成。
SpringBootConfiguration就是一个Configuratio;
EnableAutoConfiguration里面的AutoConfigurationPackage用于扫描主程序所在的包,加载组件到容器中,@Import(AutoConfigurationImportSelector.class):加载所有自动配置类;
@ComponentScan用于排除一些组件,主要是排除前面已经扫描进来的配置类、和自动配置类。


http://www.ppmy.cn/news/1222736.html

相关文章

​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第9章 软件可靠性基础知识&#xff08;P320~344&#xff09;-思维导图】 课本里章节里所有蓝色字体的思维导图

回顾——自我监督的 Vision Transformer 学到了什么?

一、说明 在尝试自我监督学习时&#xff0c;主要有两种方法&#xff1a;对比学习&#xff08;CL&#xff09;和掩模图像建模&#xff08;MIM&#xff09;。然而&#xff0c;随着MIM最近受到关注&#xff0c;很多人使用MIM&#xff0c;但他们可能不知道为什么使用它以及何时应该…

(C语言)输入一个序列,判断是否为奇偶交叉数

#include <stdio.h> #include <string.h> int main() {char str[50];gets(str);int len,tmp 1;len strlen(str); //获取字符串长度 for (int i 0;i < len-1 ;i ){if((str[i] % 2 0 ) && (str[i1] % 2 ! 0)) //判断先偶数后奇数序列 tmp ;else if((s…

持续集成指南:GitHubAction 自动构建+部署AspNetCore项目

前言 之前研究了使用 GitHub Action 自动构建和发布 nuget 包&#xff1a;开发现代化的.NetCore控制台程序&#xff1a;(4)使用GithubAction自动构建以及发布nuget包 现在更进一步&#xff0c;使用 GitHub Action 在其提供的 runner 里构建 docker 镜像&#xff0c;之后提交到阿…

PHP接收并处理请求中携带的xml格式的信息

企业微信以xml的形式给服务器发送通知。具体参考&#xff1a;企业微信文档——事件格式 dump(file_get_contents("php://input"));/***string(530) "<xml><ToUserName><![CDATA[ww55ca070cb9b7eb22]]></ToUserName><FromUserName>…

PHP写一个 电商Api接口需要注意哪些?考虑哪些?

随着互联网的飞速发展&#xff0c;前后端分离的开发模式越来越流行。编写一个稳定、可靠和易于使用的 API 接口是现代互联网应用程序的关键。本文将介绍在使用 thinkphp6 框架开发 电商API 接口时需要注意的要点和考虑的问题&#xff0c;并提供详细的逻辑步骤和代码案例。 1. …

Babyk勒索病毒数据集恢复,计算机服务器中了babyk勒索病毒怎么办?

计算机网络技术的不断应用&#xff0c;为企业的生产运营提供了极大便利&#xff0c;网络技术的不断发展也带来了许多网络安全隐患&#xff0c;近期&#xff0c;云天数据恢复中心陆续接到许多企业的求助&#xff0c;企业的计算机服务器遭到了babyk勒索病毒的攻击&#xff0c;导致…