SpringBoot 自动装配原理---源码详解

目录

  • SpringBoot 自动装配原理
    • 源码流程详解:
    • 流程总结:
    • 条件匹配解释:
    • 其他解释:

SpringBoot 自动装配原理

源码流程详解:

1、先看启动类,启动这个main方法,然后调用这个run方法。
2、把 启动类作为参数传进run方法
3、然后看run方法的调用流程,如图,run方法做了很多事情,挑核心的讲,核心点是走到这个 refreshContext(context); 方法
在这里插入图片描述


4、refreshContext(context); 就是拿到了 App.class 这个配置类并进行解析。可以理解成是解析这个 @SpringBootApplication 这个注解。
在这里插入图片描述


5、@SpringBootApplication 是个组合注解,重点就是如图这三个注解:
配置类注解、启动自动配置的注解、扫描包的注解
在这里插入图片描述


6、 @SpringBootConfiguration 这个注解本质是一个配置类而已
在这里插入图片描述


7、@ComponentScan :扫描当前包及其子包
在这里插入图片描述

8、@EnableAutoConfiguration:重点就是这个注解,用来实现自动转配的功能。

上面说的这个 refreshContext(context); ,其实就是在解析这三个主要的注解。
在这里插入图片描述

9、@EnableAutoConfiguration 注解,点进去,里面有 @Import(AutoConfigurationImportSelector.class) 这么个注解,调用了AutoConfigurationImportSelector.class 这个类。

在这里插入图片描述


AutoConfigurationImportSelector.class 这个类的重点就是这个方法。
当运行启动类后,会走到这个方法。
在这里插入图片描述


打个断点看。在运行启动类的过程中,会调用到这个方法。
在这里插入图片描述


getCandidateConfigurations 这个方法返回的是一个list 集合,重点是这个 .loadFactoryNames() 这个 加载工厂名字的方法。
在这里插入图片描述


如图:点进 loadFactoryNames 这个类,

通过 classLoader 类加载 这个类 去加载 classpath 里面 META-INF 里面的 spring.factories 配置文件;
读取 jar包中的 / 项目中的 META_INF/Spring.factories 配置文件
在这里插入图片描述


获取到的所有的资源是一个集合,封装到 result 里面,里面存的就是各个 spring.factories 文件。
在这里插入图片描述


以 mybatis-plus jar包为例:
上面已经说了,在运行启动类的时候,会读取所有的 spring.factories 配置文件。
点开这个spring.factories 配置文件,里面配置了一个自动装配类 ,就是这个 MybatisPlusAutoConfiguration 类,然后会把这个类读取到内存中

这个 com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration 是一个字符串。
在这里插入图片描述


然后再看这个 MybatisPlusAutoConfiguration 类。
首先,可以看出这个类就是一个配置类
在这里插入图片描述


然后这个类里面有注解 @Bean
表明这个类的作用就是帮我们创建这个 SqlSessionTemplate 对象。
就这么简单。
在这里插入图片描述

到此,这整个流程就是一个springboot的自动装配的流程了。



流程总结:

简单来说,项目启动时,通过 启动类的 @SpringBootApplication 注解,加载到 @EnableAutoConfiguration 这个启动自动装配的注解,这个注解会加载到这个AutoConfigurationImportSelector 自动配置导入选择器类 ,这个类里面就有一个方法去读取jar包中的所有的 META-INF/spring.factories 文件,然后加载这些文件。
这些 spring.factories 文件里面就配置了对应的一些自动装配的类,以字符串的形式存在,点进这些自动装配类,可以看到这些类贴有@Configuration 注解,表示这个类是一个配置类,然后这个类里面还有一些用 @Bean 注解修饰的方法,表明这个类的作用就是能帮我们自动创建该 Bean对象。



条件匹配解释:

不是每个自动装配类都会生效的。

每个自动配置类都会通过条件注解,用于判断是否满足特定的条件。条件可以是环境变量、配置属性的值、类是否存在等等。如果条件匹配成功,那么这个自动装配类才会生效。



其他解释:

一些条件注解:

@ConditionalOnBean(仅仅在当前上下文中存在某个对象时,才会实例化一个Bean)
@ConditionalOnClass(某个class位于类路径上,才会实例化一个Bean)
@ConditionalOnExpression(当表达式为true的时候,才会实例化一个Bean)
@ConditionalOnMissingBean(仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean)
@ConditionalOnMissingClass(某个class类路径上不存在的时候,才会实例化一个Bean)
@ConditionalOnNotWebApplication(不是web应用)


什么是 External Libraries?

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/226715.shtml

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

相关文章

南京邮电大学数据库实验二

1. 用create database命令创建电影数据库(MovieDB)。 create database MovieDB; 在创建表之前需调用一下指定的数据库: use MovieDB; 2.在电影数据库中用create table 命令创建如下5个关系模式: 创建movies表: create table Movies( ti…

城市货车通行码二维码解析

目录 说明 界面 下载 城市货车通行码二维码解析 说明 二维码扫描信息为: tmri://12123?ywlx1041&ewmeyJ0eHpiaCI6IjUxMDcwMDAwMDE0MyIsInR4em1jIjoiQeivgSIsImhwemwiOiIwMiIsImhwaG0iOiLlt51CMkwzMjYiLCJrc3JxIjoiMjAyMS0xMS0yOCIsImpzcnEiOiIyMDIyLTEyL…

虚幻学习笔记12—C++类的实例化

一、前言 本系列如无特殊说明使用的虚幻版本都是5.2.1,VS为2022版本。在Unity中通常创建的脚本都默认继承了MonoBehavior,都是不能再用代码New而实例化的,虚幻也是一样不能直接New来实例化。在Unity中是通过Instantiate方法来实例化一个游戏对…

C++ lambda表达式

写法格式 lambda表达式的写法格式如下: [capture-list] (parameters) mutable -> ret { statement } 各部分的说明为:[capture-list] : 捕获列表,编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中…

【ArcGIS Pro微课1000例】0055:Pro中如何处理个人数据库(.mdb)

文章目录 原因分析解决方案使用ArcGIS Pro的用户应该已经发现个人地理数据库(.mdb)不能使用了。随着ESRI的软件技术革新,在ArcGIS Pro中不再支持且将来也不会支持个人地理数据库(.mdb)。这个确实很烦人,很多项目还是在使用mdb数据库的。不过ESRI也给出了一些解决办法,不…

二叉搜索树的简单C++类实现

二叉搜索树(BST)是一种重要的数据结构,它对于理解树的操作和算法至关重要。本文将通过一个C示例来展示如何实现一个BST,并在插入和删除节点时提供清晰的输出,以帮助可视化这些操作的过程。 二叉搜索树的节点结构 首先…

Elasticsearch 8.9 search命令执行查询源码

一、相关的API的handler1、接收HTTP请求的handler2、往数据节点发送查询请求的action(TransportSearchAction)3、通过transportService把查询请求发送到指定的数据节点 二、数据节点收到请求的处理逻辑1、尝试从缓存中加载查询结果2、不通过缓存查询,直接执行查询(1…

Elasitcsearch--解决CPU使用率升高

原文网址:Elasitcsearch--解决CPU使用率升高_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何解决ES导致的CPU使用率升高的问题。 问题描述 线上环境 Elasticsearch CPU 使用率飙升常见问题如下: Elasticsearch 使用线程池来管理并发操作的 CPU 资源。…

智慧农业大数据可视化UI,数据展示平台(免费可视化大屏模版PS资料)

大屏幕展示方式可以实现信息的直观呈现与交互操作,使农业生产者能够一目了然地掌握有关农情、天气、土壤等数据信息,从而科学决策。智慧农业大数据可视化大屏是提升农业生产效益的一种重要工具。 现分享亩产效益指标、农业大数据可视化、农业数据展示平…

QEMU源码全解析 —— virtio(11)

接前一篇文章: 上一回对于virtio_balloon_pci_realize函数进行了详细解析。最后讲到在virtio_balloon_pci_realize函数的最后一步调用了object_property_set函数,从而导致了virtio_device_realize函数的执行。本回就来对于virtio_device_realize函数进行…

Flutter工具安装与环境搭建

1、下载 Flutter SDK,下载完成后,在需要放置SDK的地方解压即可。 注意: 请勿将 Flutter 有特殊字符或空格的路径下。请勿将 Flutter 安装在需要高权限的文件夹内,例如 C:\Program Files\。 2、配置环境变量 例如: …

NO-IOT翻频,什么是翻频,电信为什么翻频

1.1 翻频迁移最终的目的就是减少网络的相互干扰,提供使用质量. 1.2 随着与日俱增的网络规模的扩大,网内干扰已成了影响网络的质量标准之一,为了保障电信上网体验,满足用户日益增长的网速需求,更好的服务客户,电信针对…

【迅搜09】索引管理(二)增删改操作

索引管理(二)增删改操作 今天我们来学习真正的,最核心的索引管理相关的操作。但其实今天的内容还更简单一些,为啥呢?因为索引管理中,最核心的就是对于数据的增、删、改呀。其实要往大了说,查询也…

缓存的定义及重要知识点

文章目录 缓存的意义缓存的定义缓存原理缓存的基本思想缓存的优势缓存的代价 缓存的重要知识点 缓存的意义 在互联网高访问量的前提下,缓存的使用,是提升系统性能、改善用户体验的唯一解决之道。 缓存的定义 缓存最初的含义,是指用于加速 …

宝塔PostgreSQL设置数据库远程访问

宝塔PostgreSQL设置数据库远程访问 宝塔的PostgreSQL1. 添加数据库2. 打开PostgreSQL设置界面3. 修改配置4. 重载配置/重启数据库 Docker的PostgreSQL1. postgresql.conf2. pg_hba.conf3. 重启数据库 注意其他问题 宝塔PostgreSQL设置数据库远程访问?docker容器Post…

CleanMyMac X2024(Mac优化清理工具)v4.14.5中文版

CleanMyMac X是一款颇受欢迎的专业清理软件,拥有十多项强大的功能,可以进行系统清理、清空废纸篓、清除大旧型文件、程序卸载、除恶意软件、系统维护等等,并且这款清理软件操作简易,非常好上手,特别适用于那些刚入手苹…

《每天一个Linux命令》 -- (15) mkdir命令

欢迎阅读《每天一个Linux命令》系列 !在本篇文章中,将说明mkdir命令用法。 概念 mkdir命令是Linux系统下的目录创建命令,用于创建指定的目录。 英文原意:make directories,所在路径:/bin/mkdir&#xff0…

【AI】YOLO学习笔记

作为经典的图像识别网络模型,学习YOLO的过程也是了解图像识别的发展过程,对于初学者来说,也可以了解所采用算法的来龙去脉,构建解决问题的思路。 1.YOLO V1 论文地址:https://arxiv.org/abs/1506.02640 YOLO&#x…

软件设计师——计算机网络(三)

📑前言 本文主要是【计算机网络】——软件设计师——计算机网络的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 &#x1…

混淆相加和拼接(js的问题)

JavaScript 中的加号 "()" 有两个功能:相加和拼接。也就是数字的相加和字符串的拼接。一些开发者经常会误用这个操作符。 比如: const num1 30; ​​const num2 "20"; ​​const num3 30; ​​const word1 "Java" ​…