Spring Boot 源码分析五:Spring Boot AutoConfiguration 自动配置机制

1. 引言

在前几篇文章中,我们探讨了 SpringBoot 的启动流程及其扩展机制。在本篇文章中,我们将深入分析 SpringBoot 的自动配置(AutoConfiguration)机制,这是 SpringBoot 最具特色和强大的功能之一。

2. 自动配置概述

SpringBoot 的自动配置机制旨在根据项目中的类路径和配置属性,自动配置 Spring 应用程序。通过自动配置,开发者无需编写大量的配置代码,就可以快速启动和运行 Spring 应用程序。

2.1 自动配置的工作原理

  • 条件注解:自动配置类使用条件注解(如 @ConditionalOnClass, @ConditionalOnMissingBean 等)来判断是否需要进行某些配置。

  • 配置文件:自动配置类通常会读取配置文件中的属性,并根据这些属性进行配置。

  • 优先级:通过 @AutoConfigureOrder 注解来控制自动配置类的优先级。

2.2 自动配置的入口

自动配置的入口位于 spring.factories 文件中。SpringBoot 使用 SpringFactoriesLoader 加载这些自动配置类。

spring.factories 文件示例
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyAutoConfiguration

3. EnableAutoConfiguration 注解

3.1 @EnableAutoConfiguration 定义

@EnableAutoConfiguration 是 SpringBoot 自动配置的核心注解,它用于启用自动配置功能。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {// 排除特定的自动配置类Class<?>[] exclude() default {};// 排除特定的自动配置类名称String[] excludeName() default {};
}
  • @AutoConfigurationPackage:用于自动配置包扫描路径。

  • @Import(AutoConfigurationImportSelector.class):导入 AutoConfigurationImportSelector,该类用于收集和注册自动配置类。

3.2 @SpringBootApplication 注解

@SpringBootApplication 注解是一个复合注解,包含了 @EnableAutoConfiguration。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {// ...
}

4. AutoConfigurationImportSelector 类

AutoConfigurationImportSelector 类负责从 spring.factories 文件中加载自动配置类,并将其导入到 Spring 应用上下文中。

4.1 selectImports 方法

selectImports 方法是 AutoConfigurationImportSelector 的核心方法,它负责选择要导入的自动配置类。

@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {if (!isEnabled(annotationMetadata)) {return NO_IMPORTS;}AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
  • isEnabled:检查自动配置是否启用。

  • AutoConfigurationMetadataLoader:加载自动配置元数据。

  • getAutoConfigurationEntry:获取自动配置条目。

4.2 getAutoConfigurationEntry 方法

getAutoConfigurationEntry 方法用于获取自动配置类的条目。

protected AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata,AnnotationMetadata annotationMetadata) {if (!isEnabled(annotationMetadata)) {return EMPTY_ENTRY;}AnnotationAttributes attributes = getAttributes(annotationMetadata);List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);configurations = removeDuplicates(configurations);configurations = sort(configurations, autoConfigurationMetadata);Set<String> exclusions = getExclusions(annotationMetadata, attributes);checkExcludedClasses(configurations, exclusions);configurations.removeAll(exclusions);configurations = filter(configurations, autoConfigurationMetadata);fireAutoConfigurationImportEvents(configurations, exclusions);return new AutoConfigurationEntry(configurations, exclusions);
}
  • getCandidateConfigurations:获取候选的自动配置类。

  • removeDuplicates:移除重复的配置类。

  • sort:对配置类进行排序。

  • getExclusions:获取排除的配置类。

  • checkExcludedClasses:检查排除的配置类。

  • filter:过滤配置类。

  • fireAutoConfigurationImportEvents:触发自动配置导入事件。

5. 创建自定义自动配置

5.1 编写自动配置类

编写一个自动配置类,并使用 @Configuration 和条件注解。

@Configuration
@ConditionalOnClass(MyService.class)
@ConditionalOnMissingBean
public class MyAutoConfiguration {@Beanpublic MyService myService() {return new MyService();}
}

5.2 配置 spring.factories 文件

在 META-INF/spring.factories 文件中配置自动配置类。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyAutoConfiguration

 

6. 结论

通过深入分析 SpringBoot 的自动配置机制,我们了解了其工作原理和实现细节。自动配置机制是 SpringBoot 强大和易用的关键,它能够根据项目需求自动配置各种组件,大大简化了开发过程。在接下来的文章中,我们将继续探讨 SpringBoot 的其他重要特性和实现细节。

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

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

相关文章

Python 语法基础二

7.常用内置函数 执行这个命令可以查看所有内置函数和内置对象&#xff08;两个下划线&#xff09; >>>dir(__builtins__) [__class__, __contains__, __delattr__, __delitem__, __dir__, __doc__, __eq__, __format__, __ge__, __getattribute__, __getitem__, __gt…

使用Spring Boot创建自定义Starter

使用Spring Boot创建自定义Starter 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何使用Spring Boot创建自定义Starter&#xff0c;来简化项目…

memcacheredis构建缓存服务器

Memcached&Redis构建缓存服务器 前言 许多Web应用都将数据保存到 RDBMS中&#xff0c;应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中&#xff0c;就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响。Memcached/redis是高性能…

【LC刷题】DAY19:77 216 17

【LC刷题】DAY19&#xff1a;77 216 17 文章目录 【LC刷题】DAY19&#xff1a;77 216 1777. 组合 [link](https://leetcode.cn/problems/combinations/description/)216. 组合总和 III [link](https://leetcode.cn/problems/combination-sum-iii/submissions/542307400/)17. 电…

通过ChatGLM的简单例子体验大模型

【图书推荐】《从零开始大模型开发与微调&#xff1a;基于PyTorch与ChatGLM》_《从零开始大模型开发与微调:基于pytorch与chatglm》-CSDN博客 ChatGLM基于GLM架构&#xff0c;针对中文问答和对话进行了优化。经过约1TB标识符的中英双语训练&#xff0c;辅以监督微调、反馈自助…

python 模板匹配图片识别点击

import cv2 import pyautogui import numpy as np import timedef find_and_click(target_image_path, threshold0.8, retry_count3, retry_interval1):"""在屏幕上查找目标图片并点击&#xff0c;支持重试。Args:target_image_path (str): 目标图片路径。thres…

Redis-Bitmap位图及其常用命令详解

1.Redis概述 2.Bitmap Bitmap 是 Redis 中的一种数据结构&#xff0c;用于表示位图&#xff08;bit array&#xff09;。 它通常用于处理大规模数据集中每个元素的状态&#xff0c;比如用户的在线/离线状态&#xff08;每个用户对应一个位&#xff0c;表示在线&#xff08;1&a…

计算机基础(6)——编码与解码-二进制与文本

&#x1f497;计算机基础系列文章&#x1f497; &#x1f449;&#x1f340;计算机基础&#xff08;1&#xff09;——计算机的发展史&#x1f340;&#x1f449;&#x1f340;计算机基础&#xff08;2&#xff09;——冯诺依曼体系结构&#x1f340;&#x1f449;&#x1f34…

Rust 程序设计语言学习——泛型、Trait和生命周期

每一种编程语言都有高效处理重复概念的工具。在 Rust 中其工具之一就是泛型。泛型是具体类型或其他属性的抽象替代。 Trait 定义了某个特定类型拥有可能与其他类型共享的功能。可以通过 Trait 以一种抽象的方式定义共同行为。可以使用 trait bounds 指定泛型是任何拥有特定行为…

Mac excel 同时冻结首行和首列

1. 选择B2窗格 2. 选择视图 3. 选择冻结窗格 最后首行和首列的分割线加粗了就表示成功了

youlai-boot项目的学习(3) 本地redis、MinIO的安装与配置

youlai-boot项目除了使用mysql数据库、还有redis&#xff0c;以及OSS服务&#xff0c;OSS除了云OSS服务&#xff0c;还有自部署的MinIO服务。 前面我们已经安装好了mysql数据库&#xff0c;那么我们来看看本地redis、MinIO服务怎么部署 环境 mac OS&#xff0c; iterm2&#…

C语言力扣刷题8——环形链表——[快慢双指针, 龟兔赛跑]

力扣刷题8——环形链表——[快慢双指针, 龟兔赛跑] 一、博客声明二、题目描述三、解题思路1、思路说明 四、解题代码&#xff08;附注释&#xff09; 一、博客声明 找工作逃不过刷题&#xff0c;为了更好的督促自己学习以及理解力扣大佬们的解题思路&#xff0c;开辟这个系列来…

分布式事务解决方案(八股)

1. CAP理论 一致性【Consistency】&#xff1a;所有节点访问最新的数据可用性【Availability】&#xff1a;非故障节点响应正常分区容错性【Partition Tolerance】&#xff1a;分布式系统出现网络分区&#xff0c;仍能对外提供服务 附&#xff1a;网络分区&#xff1a;分布式…

拳打开源SOTA脚踢商业闭源的LI-DiT是怎样炼成的?(商汤/MMLab/上海AI Lab)

文章地址&#xff1a;https://arxiv.org/pdf/2406.11831 仅基于解码器的 Transformer 的大语言模型&#xff08;LLMs&#xff09;与 CLIP 和 T5 系列模型相比&#xff0c;已经展示出卓越的文本理解能力。然而&#xff0c;在文本到图像扩散模型中利用当前先进的大语言模型的范例…

[机器学习]-3 万字话清从传统神经网络到深度学习

神经网络&#xff08;Neural Networks, NNs&#xff09;是机器学习的一种重要方法&#xff0c;灵感来源于生物神经系统&#xff0c;由大量互联的节点&#xff08;称为神经元或单元&#xff09;组成&#xff0c;通过调整这些节点间的连接权重来学习和表示复杂的非线性关系。传统…

中霖教育怎么样?注册会计师考试难吗?

中霖教育&#xff1a;注册会计师&#xff08;CPA&#xff09;考试的难度高吗&#xff1f; 对于不同背景的考生来说&#xff0c;注册会计师考试的挑战程度不同。那些有良好基础和充裕准备时间的考生&#xff0c;通过考试的可能性要超过那些从零开始且准备时间有限的人。 据最近…

GPOPS-II教程(5): 月球探测器着陆最优控制问题

文章目录 问题描述GPOPS代码main functioncontinuous functionendpoint function仿真结果 最后 问题描述 参考文献&#xff1a;[1] Meditch J. On the problem of optimal thrust programming for a lunar soft landing[J]. IEEE Transactions on Automatic Control, 1964, 9(4…

6.28学习笔记

一、马克思 1、对立的历史观&#xff1a;唯物史观、唯心史观&#xff08;不是“主义”&#xff09; 2、人口因素对社会发展起&#xff08;制约和影响&#xff09;作用 3、自然地理环境是人类社会生存和发展&#xff08;永恒的、必要的条件&#xff09; 4、哲学社会科学的发展水…

Linux基础- 使用 Apache 服务部署静态网站

目录 零. 简介 一. linux安装Apache 二. 创建网页 三. window访问 修改了一下默认端口 到 8080 零. 简介 Apache 是世界使用排名第一的 Web 服务器软件。 它具有以下一些显著特点和优势&#xff1a; 开源免费&#xff1a;可以免费使用和修改&#xff0c;拥有庞大的社区支…

Web渗透:任意文件下载

任意文件下载漏洞&#xff08;Arbitrary File Download Vulnerability&#xff09;是一种常见的Web安全漏洞&#xff0c;它允许攻击者通过修改输入参数&#xff0c;从服务器下载任意文件&#xff0c;而不仅仅是预期的文件&#xff1b;通常这种漏洞出现在处理用户输入的地方&…