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,一经查实,立即删除!

相关文章

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

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

Elasitcsearch--解决CPU使用率升高

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

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

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

Flutter工具安装与环境搭建

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

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

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

缓存的定义及重要知识点

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

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

【AI】YOLO学习笔记

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

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

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

Automotive Bionics

汽车仿生学是一种通过模拟生物系统的某些特征来设计汽车的方法。一些典型的汽车仿生学例子包括: 鲨鱼式车型:这种车型的设计灵感来源于鲨鱼的流线型身体,这种设计能够减少空气阻力和水阻力,提高车辆的燃油效率和行驶速度。 甲壳虫…

汽车EDI:Chrysler EDI项目案例

菲亚特克莱斯勒汽车Fiat Chrysler Automobiles(FCA)是一家全球性汽车制造商,主营产品包括轿车、SUV、皮卡车、商用车和豪华车等多种车型。其旗下品牌包括菲亚特、克莱斯勒、道奇、Jeep、Ram、阿尔法罗密欧和玛莎拉蒂等。 Chrysler通过EDI来优化订单处理、交付通知、…

Fuzz进阶教学——基于机器学习的模糊测试相关工作

【参考文献】[1]王鹃,张冲,龚家新等.基于机器学习的模糊测试研究综述[J].信息网络安全,2023,23(08):1-16. 目录 一、机器学习在测试用例生成中的应用 1、文件解析软件的测试用例生成 2、网络协议的测试用例生成 3、代码解析工具的测试用例生成 二、机器学习在测试用例变异中…

TrustGeo代码理解(三)model.py

代码链接:https://github.com/ICDM-UESTC/TrustGeo 一、导入各种模块和神经网络类 from math import gamma from re import L from .layers import * import torch import torch.nn as nn import torch.nn.functional as Func import numpy as np 这段代码是一个 Python 模…

Python中的程序逻辑经典案例详解

我的博客 文章首发于公众号:小肖学数据分析 Python作为一种强大的编程语言,以其简洁明了的语法和强大的标准库,成为了理想的工具来构建这些解决方案。 本文将通过Python解析几个经典的编程问题。 经典案例 水仙花数 问题描述&#xff1a…

极坐标下的牛拉法潮流计算39节点MATLAB程序

微❤关注“电气仔推送”获得资料(专享优惠) 潮流计算: 潮流计算是根据给定的电网结构、参数和发电机、负荷等元件的运行条件,确定电力系统各部分稳态运行状态参数的计算。通常给定的运行条件有系统中各电源和负荷点的功率、枢纽…

设计模式之建造者模式(二)

目录 概述概念角色类图适用场景 详述画小人业务类的介绍代码解析 建造者基本代码类介绍代码解析 总结设计原则其他 概述 概念 建造者模式是一种创建型设计模式,它可以将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。 角色 …

Python函数和模块的使用

我的博客 文章首发于公众号:小肖学数据分析 在开发过程中,函数和模块帮助我们将复杂的代码逻辑分解为可管理的部分,提升代码的可读性、可维护性和重用性。 本文将介绍如何在Python中有效利用函数和模块,提供详细的示例。 函数的…

【C++干货铺】会搜索的二叉树(BSTree)

个人主页点击直达:小白不是程序媛 C系列专栏:C干货铺 代码仓库:Gitee 目录 前言: 二叉搜索树 二叉搜索树概念 二叉搜索树操作 二叉搜索树的查找 二叉搜索树的插入 二叉搜索树元素的删除 ​二叉搜索树的实现 BSTree结点 …

GraphicsProfiler 使用教程

GraphicsProfiler 使用教程 1.工具简介:2.Navigation介绍2.1.打开安装好的Graphics Profiler。2.2.将手机连接到计算机,软件会在手机中安装一个GraphicsProfiler应用(该应用是无界面的)。2.3.Show files list2.4.Record new trace2.4.1.Appli…