SpringBoot原理-自动配置-原理分析-源码跟踪
自动配置原理
-
SpringBootApplication
- 该注解标识在SpringBoot项目的启动类上,是SpringBoot中最为重要的注解,该注解由三个部分组成。
- @SpringBootConfiguration:该注解与@Configuration注解作用一样,用来声明当前类为一个配置类
- @ComponentScan:组件扫描,默认扫描当前启动类所在包及其子包
- @EnableAutoConfiguration:SpringBoot实现自动化配置的核心注解
- 该注解是个复合注解,其中封住了一个@Import注解,指定注入到SpringIOC容器中的ImportSelector接口的实现类。

- 具体参照文章:SpringBoot原理-自动配置-方案_熵240的博客-CSDN博客
- 该实现类中实现了该接口(ImportSelector)中selectImports方法,该方法的返回值是我们要导入到IOC容器中的全类名的集合,

- 在该方法中加载了两个文件 META-INF/spring和org.springframework.boot.autoconfigure.AutoConfiguration.imports
-
META-INF/spring目录:这个目录下的文件是Spring Boot自动配置的核心配置文件。在这个目录下,可以定义多个配置文件,每个配置文件对应一个自动配置类。这些配置文件使用了Spring的SPI(Service Provider Interface)机制,通过SpringFactoriesLoader加载并实例化自动配置类。
-
org.springframework.boot.autoconfigure.AutoConfiguration.imports文件:这个文件定义了需要自动导入的其他自动配置类。在自动配置类中,可以使用@Import注解来导入其他自动配置类。而在AutoConfiguration.imports文件中,可以列出需要自动导入的自动配置类的全限定类名,这样在启动时,Spring Boot会自动将这些自动配置类导入到容器中
-
- 在imports文件中会定义非常多的自动配置类,配置类当中也会定义很多bean对象,我们可以通过注解来设置将bean对象装配到IOC容器的条件。具体参见文章:SpringBoot原理-自动配置-原理分析-@Conditional_熵240的博客-CSDN博客
- 该注解是个复合注解,其中封住了一个@Import注解,指定注入到SpringIOC容器中的ImportSelector接口的实现类。
- 该注解标识在SpringBoot项目的启动类上,是SpringBoot中最为重要的注解,该注解由三个部分组成。
小结
- 自动装配简单讲就是将第三方的bean以及配置类装载到IOC容器中,开发人员就不再需要写bean的配置了,自动装配的实现只需要在启动类上加入@SpringBootApplication注解就可以了,而@SpringBootApplication注解是一个复合注解,其中自动装配的实现是通过@EnableAutoConfiguration注解实现的,自动装配的实现主要依靠三个关键的技术。
- 第一,引入Starter,启动依赖组件的时候,该组件中必须含有@Configuration配置类,在这个配置类中,我们需要通过@Bean注解去声明要装配到IOC容器中的Bean对象
- 第二,上述配置类是放在第三方的jar包里面,然后通过SpringBoot中约定优于配置的理念去把配置类的全路径放在
META-INF/spring.factories文件中,由此SpringBoot就可以知道第三方jar包里面配置类的位置,当Spring Boot启动时,会通过SpringFactoriesLoader加载META-INF/spring.factories文件中定义的自动配置类。然后根据条件注解的判断,决定是否需要进行自动配置。 - 第三,SpringBoot拿到所有第三方jar包里面声明的配置类之后,在通过Spring提供的ImportSelector接口来实现对于这些配置类的动态加载,从而完成自动装配。该接口的实现类由@EnableAutoConfiguration注解中包含的@Import注解来指定。通过实现该中String[] selectImports()方法,该方法的返回值为需要装入Spring IOC容器中类。
相关文章:
SpringBoot原理-自动配置-原理分析-源码跟踪
自动配置原理 SpringBootApplication 该注解标识在SpringBoot项目的启动类上,是SpringBoot中最为重要的注解,该注解由三个部分组成。 SpringBootConfiguration:该注解与Configuration注解作用一样,用来声明当前类为一个配置类Comp…...
安全基础 --- 原型链污染
原型链 大部分面向对象的编程语言,都是通过“类”(class)实现对象的继承。传统上,JavaScript 语言的继承不通过 class,而是通过“原型对象”(prototype)实现 1、prototype 属性的作用 JavaScri…...
c++中的常用知识点总结
命名空间 使用命名空间之后,调用代码时可以省去也可以不省去相关的前缀。 #include <iostream>using namespace std;//使用c自己的命名空间 int main() {int num1 10;std::cout << "Hello, World!" << std::endl;cout<<num1&l…...
Leetcode:349. 两个数组的交集【题解超详细】
题目 给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 难度:简单 题目链接:349.两个数组的交集 示例 1: 输入:nums1 [1,2,2,1], nums2 [2,…...
Java 【异常】
一、认识异常 Exception 在 Java 中,将程序执行过程中发生的不正常行为称为异常 。 异常是异常exception,报错是报错error 1.算数异常 0不能作为除数,所以算数异常 2.空指针异常 arr不指向任何对象,打印不出arr的长度,…...
B - Polycarp‘s Practice
Polycarp is practicing his problem solving skill. He has a list of nn problems with difficulties a_1, a_2, \dots, a_na1,a2,…,an, respectively. His plan is to practice for exactly kk days. Each day he has to solve at least one problem from his list. …...
朴素贝叶斯数据分类------
------------------后期会编辑些关于朴素贝叶斯算法的推导及代码分析----------------- import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB, BernoulliNB, MultinomialNB from sklear…...
flask中的操作数据库的插件Flask-SQLAlchemy
1、ORM 框架 Web 开发中,一个重要的组成部分便是数据库了。Web 程序中最常用的莫过于关系型数据库了,也称 SQL 数据库。另外,文档数据库(如 mongodb)、键值对数据库(如 redis)近几年也逐渐在 w…...
arrow的使用
pandas2.0引入了pyarrow作为可选后端,比numpy的性能提高很多,所以为了改造backtrader,用cython和c++重写整个框架,准备用arrow作为底层的数据结构(backtrader现在的底层数据结构是基于python array构建的) 安装arrow推荐使用vcpkg git clone https://github.com/Microsoft…...
【24种设计模式】装饰器模式(Decorator Pattern(Wrapper))
装饰器模式 装饰器模式是一种结构型设计模式,用于动态地给对象添加额外的行为或责任,而不需要改变原始对象的结构。通过创建一个包装器类(装饰器),它包含原始对象的引用,并提供与原始对象相同的接口&#…...
小程序v-for与key值使用
小程序中的v-for和key与Vue中的用法基本相同。v-for用于循环渲染列表,key用于给每个循环项分配一个唯一的标识。 使用v-for时,通常建议使用wx:for代替,例如: <view wx:for"{{ items }}" wx:key"id">{…...
Qt包含文件不存在问题解决 QNetworkAccessManager
这里用到了Qt的网络模块,在.pro中添加了 QT network 但是添加 #include <QNetworkAccessManager> 会报错说找不到,可以通过在项目上右键执行qmake后,直接#include <QNetworkAccessManager>就不会报错了:...
【视频图像篇】FastStone Capture屏幕长截图软件
【视频图像篇】FastStone Capture屏幕长截图软件 FastStone Capture最常用的一款屏幕长截图软件—【蘇小沐】 文章目录 【视频图像篇】FastStone Capture屏幕长截图软件实验环境1、启动界面2、自定义工具栏3、自动保存 (一)长截图1、捕获滚动窗口2、捕获…...
【C语言】每日一题(杨氏矩阵查找数)
目录 杨氏矩阵介绍:方法:思路:代码实现: 杨氏矩阵介绍: 既然在杨氏矩阵中查找数,那什么是杨氏矩阵呢? 矩阵的每行从左到右是递增的,矩阵从上到下是递增的。 例如: 方法…...
探究SpringWeb对于请求的处理过程
探究目的 在路径归一化被提出后,越来越多的未授权漏洞被爆出,而这些未授权多半跟spring自身对路由分发的处理机制有关。今天就来探究一下到底spring处理了什么导致了才导致鉴权被绕过这样严重的问题。 DispatcherServlet介绍 首先在分析spring对请求处…...
如何使用Google Compute Engine入门指南快速创建和配置您的云虚拟机实例
文章目录 步骤1:创建 Google Cloud Platform(GCP)账户步骤2:设置 GCP 项目步骤3:启用 Google Compute Engine API步骤4:安装 Google Cloud SDK步骤5:创建虚拟机实例步骤6:连接到虚拟…...
springMVC中全局异常处理
前言: 当不同方法执行时,抛出相同异常。为了简约代码和避免重复使用try{}catch{}。此时使用统一异常处理。但局部的统一异常处理只能为所在类所调用。因此产生全局异常处理,该类中统一异常处理方法可以作用于整个controller。(以…...
【Nginx24】Nginx学习:压缩模块Gzip
Nginx学习:压缩模块Gzip 又是一个非常常见的模块,Gzip 现在也是事实上的 Web 应用压缩标准了。随便打开一个网站,在请求的响应头中都会看到 Content-Encoding: gzip 这样的内容,这就表明当前这个请求的页面或资源使用了 Gzip 压缩…...
我的私人笔记(zookeeper分布式安装)
分布式安装 1.安装前准备 (1)下载zookeeper:Index of /dist/zookeeper(当前使用为3.4.10版本) (2)安装JDK (3)拷贝zookeeper安装包到Linux系统下 (4)解压到指定目录 tar -xzvf zookeeper-3.4.10.tar.gz -C /opt/servers/ (5)修改名称 …...
小程序排名优化全攻略
随着小程序的快速发展,小程序之间的竞争也日益激烈。如何在竞争对手众多的环境下脱颖而出,通过小程序排名优化来提高曝光率和流量转化率,已成为许多小程序开发者和运营者关注的重点。本文将全面解析小程序排名优化的方法,让您可以更好地提升小程序的搜索排名。 【名即微】 小程…...
从Windows命令行小白到Scoop社区贡献者:我的完整成长指南
从Windows命令行小白到Scoop社区贡献者:我的完整成长指南 【免费下载链接】Scoop A command-line installer for Windows. 项目地址: https://gitcode.com/gh_mirrors/sc/Scoop 想要在Windows系统上快速安装和管理软件?厌倦了繁琐的图形界面安装过…...
5步掌握抖音音乐批量下载:douyin-downloader高效使用指南
5步掌握抖音音乐批量下载:douyin-downloader高效使用指南 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在数字内容创作的浪潮中,背景音乐已成为视频作品的灵魂元素。然而࿰…...
包装器简介
可调用对象:可以使用()运算符进行调用的对象,本质是能像函数一样使用的东西常见课调用对象:函数指针,仿函数,lambda表达式我们能否使用统一的方式对其封装,进行调用,这时…...
GIS小白必看!Global Mapper处理正射影像的5个高频问题解答(含奥维地图导入避坑指南)
GIS新手实战指南:Global Mapper正射影像处理全解析 第一次打开Global Mapper时,那些密密麻麻的工具栏和复杂的参数设置确实让人望而生畏。去年我刚接触GIS时,处理无人机航拍的正射影像就踩了不少坑——坐标系选错导致影像偏移几百米、导出分幅…...
告别向日葵和TeamViewer!用你家路由器自带的DDNS功能,免费搭建Windows远程桌面(保姆级教程)
告别第三方远程工具:用路由器DDNS解锁Windows远程桌面全速体验 每次打开向日葵或TeamViewer时,那个转圈加载的进度条是否让你眉头紧锁?当免费版突然弹出"会话时长已达上限"的提示时,是否恨不得砸键盘?作为常…...
Qt操作Excel避坑指南:为什么我放弃了QAxObject而选择QXlsx?
Qt操作Excel的终极方案:从QAxObject到QXlsx的技术迁移实战 三年前接手一个工业数据采集项目时,我遇到了职业生涯中最棘手的Excel导出问题。客户现场同时安装了Office 2016和WPS,导致基于QAxObject开发的报表模块随机崩溃。更糟的是࿰…...
OpenClaw+GLM-4.7-Flash:个人博客内容自动生成与发布
OpenClawGLM-4.7-Flash:个人博客内容自动生成与发布 1. 为什么选择这个技术组合 去年夏天,我发现自己陷入了写作瓶颈——每周要产出3篇技术博客,但80%的时间都消耗在资料收集和格式调整上。直到发现OpenClawGLM-4.7-Flash这个组合ÿ…...
1756-L55处理器单元
1756-L55 处理器单元(ControlLogix 系列PLC CPU)一、主要特点高性能处理器,适合中大型控制系统支持多任务运行与快速扫描支持在线编程与程序修改模块化结构,扩展灵活支持本地及远程I/O控制可实现冗余系统,提高可靠性支…...
一文搞懂训练大模型的数据怎么准备!
谈到大模型,很多人第一反应都是模型参数大、算力强,但其实数据才是大模型真正的底座。没有足够大、足够干净的数据,再先进的模型也发挥不出威力。今天就从数据层面,把大模型训练的几个关键环节梳理清楚。 数据采集与清洗 大模型训…...
vLLM实战:手把手教你用LLMEngine构建高效推理服务(附代码解析)
vLLM实战:从零构建高性能大模型推理服务的工程指南 当大语言模型从实验室走向生产环境时,如何实现高吞吐、低延迟的推理服务成为工程化落地的关键挑战。vLLM作为当前最受关注的开源推理框架之一,其核心组件LLMEngine的设计理念值得每一位AI工…...
