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

news2024/11/29 8:36:53

参考尚硅谷课程: 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.coloradmin.cn/o/1215909.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Mac软件]Infuse 7 PRO v7.6.3 一个强大的视频播放器(激活版)

使用Infuse制作您的视频内容&#xff0c;这是在iPhone、iPad、Apple TV和Mac上观看几乎任何格式的视频的好方法。无需转换文件&#xff01;Infuse针对macOS 12进行了优化&#xff0c;具有强大的流媒体选项、Trakt同步以及对AirPlay和字幕的无与伦比的支持。华丽的界面。精确控制…

【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引

前言 自学Java怎么学&#xff0c;找对方向很关键&#xff01;在这里为大家分享最全的架构师级Java全栈学习路线及知识清单&#xff01; 包含JavaSE基础&#xff0c;JavaWeb&#xff0c;SSM框架&#xff0c;Linux运维&#xff0c;分布式与微服务&#xff0c;大数据开发~ 本人研究…

4-flask-cbv源码、Jinja2模板、请求响应、flask中的session、flask项目参考

1 flask中cbv源码 2 Jinja2模板 3 请求响应 4 flask中的session 5 flask项目参考 1 flask中cbv源码 ***flask的官网文档&#xff1a;***https://flask.palletsprojects.com/en/3.0.x/views/1 cbv源码执行流程1 请求来了&#xff0c;路由匹配成功---》执行ItemAPI.as_view(item…

Leetcode hot100之“结合递归+二分“题目详解

1 总结 题目 215 (“数组中的第 K 个最大元素”) 和题目 4 (“寻找两个正序数组的中位数”) 之间的联系主要体现在它们都涉及到寻找一个有序集合中的第 k 个元素的问题。尽管这两个问题的具体应用场景和所处理的数据结构不同&#xff0c;它们共享相似的算法思想和技术。 题目…

系列十、堆参数调优

一、堆内存调优参数 -Xms堆空间的最小值&#xff0c;默认为物理内存的1/64-Xmx堆空间的最大值&#xff0c;默认为物理内存的1/4-XX:PrintGCDetails输出详细的GC处理日志 二、获取堆内存的默认物理内存 /*** Author : 一叶浮萍归大海* Date: 2023/11/16 14:50* Description: 获…

基于springboot的医护人员排班系统 全套代码 全套文档

基于springboot的医护人员排班系统,springboot vue mysql (毕业论文10411字以上,共27页,程序代码,MySQL数据库) 代码下载链接&#xff1a;https://pan.baidu.com/s/177HdCGtTvqiHP4O7qWAgxA?pwd0jlf 提取码&#xff1a;0jlf 【运行环境】 IDEA, JDK1.8, Mysql, Node, Vue …

荣誉榜再度添彩!热烈祝贺旭帆科技荣获安徽省大数据企业!

2023年11月3日&#xff0c;安徽省数据资源管理局网站发布《关于2023年度安徽省大数据企业名单的公示》&#xff0c;经企业申报、各市初审推荐、专家评审、审查认定等程序&#xff0c;安徽旭帆信息科技有限公司&#xff08;以下简称“旭帆科技”&#xff09;凭借在视频大数据应用…

[PyTorch][chapter 63][强化学习-时序差分学习]

目录&#xff1a; 蒙特卡罗强化学习的问题 基于转移的策略评估 时序差分评估 Sarsa-算法 Q-学习算法 一 蒙特卡罗强化学习的的问题 有模型学习&#xff1a; Bellman 等式 免模型学习: 蒙特卡罗强化学习 迭代&#xff1a; 使用策略 生成一个轨迹&#xff0c; for t…

VMware17虚拟机Linux安装教程(详解附图,带VMware Workstation 17 Pro安装)

一、安装 VMware 附官方下载链接&#xff08;VM 17 pro&#xff09;&#xff1a;https://download3.vmware.com/software/WKST-1701-WIN/VMware-workstation-full-17.0.1-21139696.exe 打开下载好的VMware Workstation 17 Pro安装包&#xff1b; 点击下一步&#xff1b; 勾选我…

损失函数——KL散度(Kullback-Leibler Divergence,KL Divergence)

KL散度&#xff08;Kullback-Leibler Divergence&#xff0c;简称KL散度&#xff09;是一种度量两个概率分布之间差异的指标&#xff0c;也被称为相对熵&#xff08;Relative Entropy&#xff09;。KL散度被广泛应用于信息论、统计学、机器学习和数据科学等领域。 KL散度衡量的…

kafka个人笔记

大部分内容源于https://segmentfault.com/a/1190000038173886, 本人手敲一边加强印象方便复习 消息系统的作用 解耦 冗余 扩展性 灵活性&#xff08;峰值处理 可恢复 顺序保证 缓冲 异步 解耦&#xff1a;扩展两边处理过程&#xff0c;只需要让他们遵守约束即可冗余&#xf…

ubuntu 20通过docker安装onlyoffice,并配置https访问

目录 一、安装docker &#xff08;一&#xff09;更新包列表和安装依赖项 &#xff08;二&#xff09;添加Docker的官方GPG密钥 &#xff08;三&#xff09;添加Docker存储库 &#xff08;四&#xff09;安装Docker &#xff08;五&#xff09;启动Docker服务并设置它随系…

MySQL覆盖索引的含义

覆盖索引&#xff1a;SQL只需要通过索引就可以返回查询所需要的数据&#xff0c;而不必通过二级索引查到主键之后再去查询数据&#xff0c;因为查询主键索引的 B 树的成本会比查询二级索引的 B 的成本大。 也就是说我select的列就是我的索引列&#xff08;或者主键&#xff0c;…

整理笔记——MOS管、三极管、IGBT

一、MOS管 在实际生活要控制点亮一个灯&#xff0c;例如家里的照明能&#xff0c;灯和电源之间就需要一个开关需要人为的打开和关闭。 再设计电路板时&#xff0c;如果要使用MCU来控制一个灯的开关&#xff0c;通常会用mos管或是三极管来做这个开关元件。这样就可以通过MCU的信…

填充每个节点的下一个右侧节点指针

题目链接 填充每个节点的下一个右侧节点指针 题目描述 注意点 给定一个 完美二叉树 解答思路 广度优先遍历一层层的遍历二叉树&#xff0c;将每一层节点的next指针都指向右侧节点 代码 class Solution {public Node connect(Node root) {if (root null) {return null;}…

【YOLOX简述】

YOLOX的简述 一、 原因1. 背景2. 概念 二、 算法介绍2.1 YOLOX算法结构图&#xff1a;2.2 算法独特点2.3 Focus网络结构2.4 FPN&#xff0c;PAN2.5 BaseConv2.6 SPP2.7 CSPDarknet2.8 YOlO Head 三、预测曲线3.1 曲线 一、 原因 1. 背景 工业的缺陷检测是计算机视觉中不可缺少…

2022年第八届美亚杯个人赛复盘

以学生的身份最后一次打美亚杯了还是要记录一下的写个wp告别哈哈。 1.[单选题] 王晓琳在这本电子书籍里最后对哪段文字加入了重点标示效果(Highlight)?(2分) A. 卿有何妙计 B. 宝玉已是三杯过去了 C. 武松那日早饭罢 D. 就除他做个强马温罢 2.[多选题] 王晓的手机里有一个 …

c#之反射详解

总目录 文章目录 总目录一、反射是什么&#xff1f;1、C#编译运行过程2、反射与元数据3、反射的优缺点 二、反射的使用1、反射相关的类和命名空间1、System.Type类的应用2、System.Activator类的应用3、System.Reflection.Assembly类的应用4、System.Reflection.Module类的应用…

销售管道管理软件推荐:提升销售业绩与效率

在企业中销售部门扮演着锐意进取的尖刀部队的角色&#xff0c;肩负着拓展公司发展领土的重要责任。销售管理是一个漫长而复杂的过程&#xff0c;需要经历潜在的商机、联系跟进、签订合同以及赢得订单等关键里程碑&#xff0c;无论是面向C端用户的销售还是面向企业复杂产品的销售…

TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…