002-Spring boot 自动配置相关分析

目录

    • 自动配置
      • 开启自动配置
      • 读取配置
      • 提前过滤

自动配置

开启自动配置

在Spring 启动类上的 @SpringBootApplication 中有 @EnableAutoConfiguration

读取配置

@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}

也就是导入了 AutoConfigurationImportSelector
我们在 Spring 时代知道这个类会返回配置类的全类名
也就是在 selectImports 方法中返回了自动配置的相关类的全类名的集合
Spring boot 自动装配的配置类有144个
如果一个一个写,那代码就太长了
所以Spring 就把这些配置类都配置在一个文件中

getAutoConfigurationEntry(annotationMetadata)//读取 @EnableAutoConfiguration 的配置信息
AnnotationAttributes attributes = getAttributes(annotationMetadata);
//读取所有的 META-INF/spring.factories 文件中配置的配置类
//读取所有的 @AutoConfiguration 注解的配置类
//这里会把 classLoader里所有的META-INF/spring.factories文件都读出来汇总
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
//有序去重 这一步很好玩 平时也可以用 
//new ArrayList<>(new LinkedHashSet<>(list));
configurations = removeDuplicates(configurations);//读取 注解中配置的排除类 排除掉
Set<String> exclusions = getExclusions(annotationMetadata, attributes);
checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);//这一步 是提前过滤一些肯定不能行的配置类
//具体怎么做的下边分析
configurations = getConfigurationClassFilter().filter(configurations);
//触发自动配置导入事件
fireAutoConfigurationImportEvents(configurations, exclusions);
return new AutoConfigurationEntry(configurations, exclusions);

META-INF/spring.factories 文件示例:
在这里插入图片描述

//文件内容 接口 = 类名列表,多个用“,”隔开文件解析方法 loadSpringFactories()://读取classLoader中所有的文件
Map<String, List<String>> result = new HashMap<>();
Enumeration<URL> urls = classLoader.getResources(FACTORIES_RESOURCE_LOCATION);
while (urls.hasMoreElements()) {URL url = urls.nextElement();//读取并创建资源UrlResource resource = new UrlResource(url);//解析成 properties 其实就是个 MapProperties properties = PropertiesLoaderUtils.loadProperties(resource);for (Map.Entry<?, ?> entry : properties.entrySet()) {String factoryTypeName = ((String) entry.getKey()).trim();// 按 ‘,’ 分割String[] factoryImplementationNames =StringUtils.commaDelimitedListToStringArray((String) entry.getValue());for (String factoryImplementationName : factoryImplementationNames) {//这个就是常用的 map的value是listresult.computeIfAbsent(factoryTypeName, key -> new ArrayList<>()).add(factoryImplementationName.trim());}}
}
return result;

提前过滤

getConfigurationClassFilter().filter(configurations):getConfigurationClassFilter():
//读取到三个
//OnBeanCondition
//OnClassCondition
//OnWebApplicationCondition
filters = SpringFactoriesLoader.loadFactories(AutoConfigurationImportFilter.class, this.beanClassLoader);
for (AutoConfigurationImportFilter filter : filters) {invokeAwareMethods(filter);
}
//这里再创建 ConfigurationClassFilter 的时候就读取了预处理的配置文件
//META-INF/spring-autoconfigure-metadata.properties
//这个配置类里边已经配好类名和提前过滤配置的内容
return this.configurationClassFilter = new ConfigurationClassFilter(this.beanClassLoader, filters);//根据配置类中的内容提前过滤一下
//OnBeanCondition :没有配置类型的Bean定义就别解析了
//OnClassCondition :没有配置的类文件就别解析了
//OnWebApplicationCondition :不是配置的上下文类型就别解析了
//这样一来就快速的过滤掉一些肯定不能创建的配置类
ConfigurationClassFilter.filter(configurations):

META-INF/spring-autoconfigure-metadata.properties 文件内容示例:
在这里插入图片描述

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

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

相关文章

数据结构篇七:排序

文章目录 前言1.插入排序1.1 基本思想1.2 代码实现1.3 特性总结 2.希尔排序2.1 基本思想2.2 代码实现2.3 特性总结 3. 选择排序3.1 基本思想3.2 代码实现3.3 特性总结 4. 堆排序4.1 基本思想4.2 代码实现4.3 特性总结 5. 冒泡排序5.1 基本思想5.2 代码实现5.3 特性总结 6. 快速…

Django配置(部署环境较乱,暂时启用)

django配置 web服务器中部署项目及WSGI简介 web服务器 WSGI 在IIS中部署django项目 安装 wfastcgi &#xff1a;pip install wfastcgi安装IIS&#xff1a; 以上选择项勾选后确定 将CGI文件复制到项目中&#xff0c; 将项目复制到IIS默认目录中 部署IIS 添加变量信息如下…

探索FSM (有限状态机)应用

有限状态机&#xff08;FSM&#xff09; 是计算机科学中的一种数学模型&#xff0c;可用于表示和控制系统的行为。它由一组状态以及定义在这些状态上的转换函数组成。FSM 被广泛用于计算机程序中的状态机制。 有限状态机&#xff08;FSM&#xff09;应用场景 在各种自动化系统…

Ceph集群安装部署

Ceph集群安装部署 目录 Ceph集群安装部署 1、环境准备 1.1 环境简介1.2 配置hosts解析(所有节点)1.3 配置时间同步2、安装docker(所有节点)3、配置镜像 3.1 下载ceph镜像(所有节点执行)3.2 搭建制作本地仓库(ceph-01节点执行)3.3 配置私有仓库(所有节点执行)3.4 为 Docker 镜像…

2023杭电多校第8场E题-0 vs 1

题目链接&#xff1a;http://csoj.scnu.edu.cn/contest/102/problem/1005 解题思路&#xff1a; 代码如下&#xff1a; #include<iostream> #include<math.h> #include<algorithm> using namespace std; const int N 1e5 10;int s[N], l, r; int now;int…

【LeetCode-中等】剑指 Offer 29. 顺时针打印矩阵(详解)

题目 输入一个矩阵&#xff0c;按照从外向里以顺时针的顺序依次打印出每一个数字。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#xff1a;matrix [[1,2,3,4],[5,6,7,8],[9,10,1…

oracle 增加控制文件

oracle 增加控制文件 1、看control_file路径 SQL> show parameter controlNAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_file_record_keep_time integer …

谈一谈在两个商业项目中使用MVI架构后的感悟

作者&#xff1a;leobertlan 前言 当时项目采用MVP分层设计&#xff0c;组员的代码风格差异也较大&#xff0c;代码中类职责赋予与封装风格各成一套&#xff0c;随着业务急速膨胀&#xff0c;代码越发混乱。试图用 MVI架构 单向流 形成 掣肘 带来一致风格。 但这种做法不够以…

Python-OpenCV中的图像处理-傅里叶变换

Python-OpenCV中的图像处理-傅里叶变换 傅里叶变换Numpy中的傅里叶变换Numpy中的傅里叶逆变换OpenCV中的傅里叶变换OpenCV中的傅里叶逆变换 DFT的性能优化不同滤波算子傅里叶变换对比 傅里叶变换 傅里叶变换经常被用来分析不同滤波器的频率特性。我们可以使用 2D 离散傅里叶变…

TiktTok推“飞轮计划”,推动社交商务生态发展

2023年&#xff0c;TikTok可谓动作频频&#xff0c;为了快速在海外市场中推进社交电商的发展进程&#xff0c;该平台正在采取多项措施&#xff0c;以实现其全球电子商务业务翻两番的目标&#xff0c;即通过TikTok Shop实现年商品销售总额达200亿美元 。 因此&#xff0c;TikTo…

基于Spring Boot的影视点播网站设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的影视点播网站设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java springboot…

音视频 vs2017配置FFmpeg

vs2017 ffmpeg4.2.1 一、首先我把FFmpeg整理了一下&#xff0c;放在C盘 二、新建空项目 三、添加main.cpp&#xff0c;将bin文件夹下dll文件拷贝到cpp目录下 #include<stdio.h> #include<iostream>extern "C" { #include "libavcodec/avcodec.h&…