SpringBoot的自动配置

news2024/9/20 6:27:54

参考视频:每一帧都是干货!15分钟的视频花2小时看

一、配置类(Configuration Class)

广义的配置类:被注解@Component直接或间接修饰的某个类,即我们常说的Spring组件,其中包括了@Configuration类
侠义的配置类:特指被注解@Configuration所修饰的某个类,又称为@Configuration类

二、SpringBoot自动配置实例

  1. 引入依赖
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 配置Redis服务器
spring:
	redis:
		database:0
		host:127.0.0.1
		port:6379
		password:123456
  1. 直接使用RedisTemplate或StringRedisTemplate
@Autowired
private RedisTemplate<Object, Object> redisTemplate;

@Autowired
private StringRedisTemplate stringRedisTemplate;
  1. 提出问题:自动配置
  • 我们除了通过maven引入一个starter外,其他什么也没有做,但是呢,SpringBoot就自动完成了Redis的配置,将相关的Bean对象注册到IOC容器中了。那么SpringBoot是如何做到这一点的呢?这就是这篇博客所要说明的问题了。

三、自动配置,一切从注解@SpringBootApplicaiton说起

  1. @SpringBootApplication注解
    在这里插入图片描述
  2. Spring SPI机制与Spring Factories机制
    Spring SPI超简单
    在这里插入图片描述
  3. 下面我们逐步分析@EnableAutoConfiguration的自动配置
  • @SpringBootApplication
  • @EnableAutoConfiguration
  • @Import(AutoConfigurationImportSelector.class)
  • AutoConfigurationImportSelector.class的关键代码selectImports()方法
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata){
	if(!isEnabled(annotationMetadata))
		return NO_IMPORTS;
	AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
			.loadMetadata(this.beanClassLoader);
	//SpringBoot自动配置的入口方法
	AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(
			autoConfigurationMetadata, annotationErtadata);
	return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
  • selectImports()方法中引用的getAutoConfigurationEntry()
protected AutoConfigurationEntry getAutoConfigurationEntry(
		AutoConfigurationMetadata autoConfigurationMetadata,
		AnnotationMetadata annotationMetadata){
	//1. 获取annotationMetadata的注解@EnableAutoConfiguration的属性
	AnnotationAttributes attributes = getAttributes(annotationMetadata);
	//2. 从资源文件Spring.factories中获取EnableAutoConfiguration对应的所有的类
	List<String> configurations = getCandidateConfigurations(
		annotationMetadata, attributes);
	//3. 通过在注解@EnableAutoConfiguration设置exclude的相关属性,可以排除指定的自动配置类
	Set<String> exclusions = getExclusions(anntationMetadata, attributes);
	checkExcludedClasses(configurations, exclusions);
	configurations.removeAll(exclusions);
	//4. 根据注解@Conditional来判断是否需要排除某些自动配置类
	configurations filter = filter(configurations, autoConfigurationMetadata);
	//5. 触发AutoConfiguration导入的相关事件
	fireAutoCOnfigurationImportEvents(configurations, exclusions);
	return new AutofigurationEntry(configurations, exclusions);
}
  • getAutoConfigurationEntry()引用的getCandidateConfigurations()
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, 
		AnnotationAttributes attributes){
	//通过SpringFactories机制,从配置文件Spring.factories中找出所有的自动配置类
	List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
			EnableAutoConfiguration.class, getBeanClassLoader());
	Assert.notEmpty(configurations,"No auto configuration classes found");
	return configurations;
}
  • getCandidateConfigurations方法,选择META-IF/spring.factories的,EnableAutoConfiguration类
    在这里插入图片描述

四、@EnableAutoConfiguration自动配置总体流程

在这里插入图片描述

五、这里是给我自己提个醒

META-IF/spring.factories是在Maven引入的Jar包中,每一个Jar都有自己META-IF/spring.factories,所以SpringBoot是去每一个Jar包里面寻找META-IF/spring.factories,而不是我的项目中存在META-IF/spring.factories(当然也可以存在,但是我项目的META-IF/spring.factories肯定没有类似以下这些东西)
在这里插入图片描述

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

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

相关文章

类加载器与双亲委派

-----摘自 周志明 《深入理解Java虚拟机》类加载器Java虚拟机设计团队有意把类加载阶段中的“通过一个类的全限定名来获取描述该类的二进制字节流”这个动作放到Java虚拟机外部去实现&#xff0c;以便让应用程序自己决定如何去获取所需的类。实现这个动作的代码被称为“类加载器…

R语言多元数据统计分析在生态环境中的实践应用

生态环境领域研究中常常面对众多的不同类型的数据或变量&#xff0c;当要同时分析多个因变量&#xff08;y&#xff09;时需要用到多元统计分析&#xff08;multivariate statistical analysis&#xff09;。多元统计分析内容丰富&#xff0c;应用广泛&#xff0c;是非常重要和…

管易云与网易互客对接集成发货单=>编辑订单

对接源平台:管易云管易云是金蝶旗下专注提供电商企业管理软件服务的子品牌&#xff0c;先后开发了C-ERP、EC-OMS、EC-WMS、E店管家、BBC、B2B、B2C商城网站建设等产品和服务&#xff0c;涵盖电商业务全流程。对接目标系统:网易互客网易互客是一款智能化的客户关系管理工具。可以…

JavaEE3-Spring创建

目录 1.创建一个普通的Maven项目 2.添加Spring框架支持(spring-context&#xff0c;spring-beans) 3.添加启动类 1.创建一个普通的Maven项目 不选择任何模板&#xff0c;直接点Next。 Name&#xff1a;项目名称&#xff1b; Location&#xff1a;项目保存路径&#xff1b; …

【文件操作】-还在为运行的数据没法保存而烦恼吗??这篇博客让你十分钟之内解决问题,赶紧进来看看!!!

&#x1f387;作者&#xff1a;小树苗渴望变成参天大树 &#x1f4a6;作者宣言&#xff1a;认真写好每一篇博客 &#x1f496;作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; ✨文件操作&#x1f9e8;前言&#x1f4a4;一…

压力测试和JMeter使用分析

压力测试考察当前软硬件环境下系统所能承受的最大负荷并帮助找出系统瓶颈所在。 压测都 是为了系统在线上的处理能力和稳定性维持在一个标准范围内&#xff0c;做到心中有数。 使用压力测试&#xff0c;我们有希望找到很多种用其他测试方法更难发现的错误。 有两种错误类型是:…

nginx简单梳理

Nginx总结 这里写目录标题Nginx总结**Nginx** **的简介**1、什么是 **nginx**2、正向代理3、反向代理4、负载均衡**5**、动静分离**Nginx** 的安装**Nginx** **的常用的命令****Nginx** 的配置文件**Nginx** **配置实例**-**反向代理实例** **1****Nginx** **配置实例**-**负载…

408—栈,队列和数组

stl里面的栈中没有清空的函数&#xff0c; 需要自己编写函数清空&#xff08;while循环返回pop&#xff09;&#xff0c; 更常见的做法是重新定义一个栈&#xff0c;这样的时间复杂度就是O(1)栈的基本操作&#xff0c;出栈入栈判空和求栈的长度,和取栈顶元素以及清空出栈和取栈…

初学者C语言练习题-函数

二、函数 一个C程序有且只有一个主函数&#xff0c;即main函数。 C程序就是执行主函数里的代码&#xff0c;也可以说这个主函数就是C语言中的唯一入口。而main前面的int就是主函数的类型.printf()是格式输出函数&#xff0c;这里就记住它的功能就是在屏幕上输出指定的信息retur…

MATLAB-自动控制原理-控制系统的数学模型

目录 一、利用MATLAB进行数学模型转换 语法&#xff1a; 例&#xff08;将传递函数写成零极点的形式&#xff09;&#xff1a; 例&#xff08;将传递函数写成因子式的形式&#xff09;&#xff1a; 二、利用MATLAB求系统传递函数 串联等效&#xff1a; 并联等效&#xf…

uboot启动流程详细分析(基于i.m6ull)

uboot介绍 uboot就是一段引导程序&#xff0c;在加载系统内核之前&#xff0c;完成硬件初始化&#xff0c;内存映射&#xff0c;为后续内核的引导提供一个良好的环境。uboot是bootloader的一种&#xff0c;全称为universal boot loader。 一、uboot的makefile 1.1 makefile整…

ccc-sklearn-16-XGBoost(2)

文章目录XGBoost的其他参数选择弱评估器&#xff1a;参数boosterXGB的目标函数&#xff1a;参数objectiveXGB目标函数的求解参数化决策树ftf_tft​&#xff1a;参数alpha&#xff0c;lambda寻找最佳树结构&#xff1a;求解w和T寻找最佳分枝&#xff1a;结构分数之差让树停止生长…

C++ 函数重载:女友说的话到底是什么意思?

&#x1f451;专栏内容&#xff1a;C学习笔记⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;日拱一卒&#xff0c;功不唐捐 目录一、前言二、函数重载1、函数重载概念2、函数重载的分类Ⅰ、参数类型不同Ⅱ、参数个数不同Ⅲ、参数类型顺序不同3、函数重载…

vs code,platform下载Arduino程序到ESP8266,并传送文件到flash

参考视频&#xff1a;https://www.bilibili.com/video/BV1yR4y1X72D/ 首先要知道 存储空间中有程序的存储地址和文件存储地址&#xff0c;可以对单独一个部分的写入不影响另一部分内容。 vs code 的platformIO插件进行程序和文件的上传 基本创建工程和程序可以参考&#x…

启明欣欣STM32开发板移植FreeRTOS

承接这篇文章&#xff0c;本篇讲述如何把FreeRTOS移植到启明欣欣STM32开发板里&#xff0c;比较简单&#xff0c;网上也有各种教程&#xff0c;本文也是参考其它文章&#xff0c;这里再记录一下。 一 搭建基础工程 启明欣欣STM32开发板上的MCU是STM32F407ZGT6&#xff0c;根据…

智能电视机安装App

每年的12月18日是世界电视机日&#xff0c;电视机诞生于1925年&#xff0c;最初是电子机械式电视机&#xff1b;到了1933年&#xff0c;诞生CRT电视&#xff0c;即黑白电视&#xff0c;它只有黑色或白色&#xff0c;看任何物品都是黑色或者白色。又过了20年&#xff0c;1953年彩…

Java之collection集合、常见数据结构、List和泛型

目录集合概述总结Collection集合的体系特点总结Collection集合常用APICollection集合的遍历方式方式一&#xff1a;迭代器总结方式二&#xff1a;foreach/增强for循环方式三&#xff1a;lambda表达式Collection集合存储自定义类型的对象总结常见数据结构数据结构概述、栈、队列…

【C++初阶】C++基础(一)

C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式等。熟悉C语言之后&#xff0c;对C学习有一定的帮助&#xff0c;本文主要目标&#xff1a;1. 补充C语言语法的不足&#xff0c;以及C是如何对C语言设计不合理…

尚医通-首页显示-前端数据整合(二十六)

目录&#xff1a; &#xff08;1&#xff09;前台用户系统-首页显示-整合静态页面 &#xff08;2&#xff09;前台用户系统-首页显示-数据接口开发 &#xff08;3&#xff09;前端用户系统-首页显示-前端整合 &#xff08;1&#xff09;前台用户系统-首页显示-整合静态页面 …

代码随想录第七天(541、剑指05)

文章目录541. 反转字符串 II发现了三个基础知识的问题看答案改进剑指 Offer 05. 替换空格答案方法1答案方法2知识点一、二、三、总结541. 反转字符串 II 发现了三个基础知识的问题 第一个 这个题目发现了一个非常大的问题&#xff0c;有点不知道自己的Java基础到底有多少窟窿…