Spring Boot自动配置原理揭秘

news2024/11/25 10:41:02

自动配置原理

  • 概述
    • 原理
      • Spring Boot Starter
      • spring.factories 文件
      • @ConditionalOnX 注解
      • 配置 Bean
      • 配置属性
    • 源码剖析

在这里插入图片描述

主页传送门:📀 传送

概述


  Spring Boot 是一个用于创建独立的、生产级别的 Spring 应用程序的框架。它极大地简化了 Spring 应用程序的开发过程,其中一个关键的功能就是自动配置(Auto-Configuration)。

  自动配置可以根据项目需求自动配置各种服务和组件,它可以帮助开发者在不需要显式配置的情况下,快速地构建一个运行的应用程序。

  自动配置是 Spring Boot 的一个核心特性,它通过分析项目的依赖和环境,自动地为应用程序配置 Spring 配置文件。这意味着开发者无需手动配置大量的 Spring Bean,Spring Boot 会根据环境和项目的依赖来智能地为应用程序创建所需的 Bean。

原理


  Spring Boot的自动配置原理基于Java的反射机制和Spring的IoC容器。它通过读取项目中的配置文件(如application.properties或application.yml),根据配置信息自动创建和配置各种服务。

可以概括为以下几个步骤:

Spring Boot Starter


  Spring Boot 项目通常依赖于所谓的 “Starters”,这是一组预定义了常用库的依赖集合。Starters 包含了应用程序所需的所有依赖,比如 Web Starter 会包含用于构建 Web 应用程序的所有必要库。

spring.factories 文件


  在每个 Starter 的 META-INF/spring.factories 文件中,定义了一系列的自动配置类。这些自动配置类会在应用程序启动时被 Spring Boot 自动扫描和加载。

@ConditionalOnX 注解


  在自动配置类中,通常会使用 @ConditionalOnX 注解来控制该自动配置是否生效。这个注解会根据特定的条件(比如类是否在类路径中、特定的 Bean 是否存在等)来决定是否应用这个配置。

配置 Bean


  自动配置类会定义一些必要的 Bean,并使用 @Configuration 注解将它们标记为配置类。这些 Bean 会在 Spring 上下文中被自动注册。

配置属性


  自动配置类还可以通过读取 application.propertiesapplication.yml 文件中的属性来自定义它们的行为。这样,开发者可以根据需要进行定制。

源码剖析


Spring Boot 应用的启动类一般均位于src/main/java根路径下

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

  @SpringBootApplication开启组件扫描和自动配置,而SpringApplication.run则负责启动引导应用程序。@SpringBootApplication是一个复合Annotation,它将三个有用的注解组合在一起:

@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 {
    // ...省略内容
}

  @SpringBootConfiguration就相当于@Configuration,它是 Spring 框架的注解,标明该类是一个JavaConfig配置类。而@ComponentScan启用组件扫描。

  @EnableAutoConfiguration注解表示开启 Spring Boot 自动配置功能,Spring Boot 会根据应用的依赖、自定义的 bean、classpath 下有没有某个类 等等因素来猜测你需要的 bean,然后注册到 IOC 容器中。@EnableAutoConfiguration是如何推算出需求的?首先来看下它的定义:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
    // ...省略内容
}

  重点关注点在@Import({AutoConfigurationImportSelector.class}) @Import注解用于导入类,并将这个类作为一个 bean 的定义注册到容器中,这里它将把EnableAutoConfigurationImportSelector作为 bean 注入到容器中,而这个类会将所有符合条件的@Configuration 配置都加载到容器中,查看EnableAutoConfigurationImportSelector代码可以看到:

AutoConfigurationImportSelector 实现了DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered 这些接口。核心代码为

public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {
    //...
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        if (!this.isEnabled(annotationMetadata)) {
            return NO_IMPORTS;
        } else {
            AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);
            return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
        }
    }
}

再来具体看getAutoConfigurationEntry 方法具体是如何判断哪些是需要导入的。

protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
        if (!this.isEnabled(annotationMetadata)) {
            return EMPTY_ENTRY;
        } else {
            AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
            List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
            configurations = this.removeDuplicates(configurations);
            Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
            this.checkExcludedClasses(configurations, exclusions);
            configurations.removeAll(exclusions);
            configurations = this.getConfigurationClassFilter().filter(configurations);
            this.fireAutoConfigurationImportEvents(configurations, exclusions);
            return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
        }
    }

annotationMetadata 参数是一个元数据接口,它提供了对注解元数据的访问权限,通常用于在运行时检查类上的注解。

getAutoConfigurationEntry(annotationMetadata)方法会根据传入的 annotationMetadata返回一个 AutoConfigurationEntry 对象。

AutoConfigurationEntry 是一个内部类,用于封装自动配置项的信息,包括该自动配置项的类名、条件(Conditions)等信息。

  通过获取到的 autoConfigurationEntry 对象,Spring Boot 就能够知道哪些自动配置类需要被导入,从而将它们注册到 Spring 上下文中。

在这里插入图片描述

  如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏  🙌一起讨论
  你的支持就是我✍️创作的动力!					  💞💞💞

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

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

相关文章

潮玩产业迈向千亿级,泡泡玛特未来发展空间可观

作为融合了艺术与创意的新品类&#xff0c;潮玩成为当下一种火热的消费现象。目前&#xff0c;全球潮玩产业处于快速增长期。近期&#xff0c;新华网联合中国社会科学院财经战略研究院发布的《超越潮流&#xff1a;千亿级潮玩产业彰显人文经济价值——潮玩产业发展报告&#xf…

华为OD机试 - 一种字符串压缩表示的解压 - 考生抽中题(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路1、题意2、根据题意&#xff0c;不合法方式如下&#xff1a;3、解题思路 五、Java算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为O…

Nginx 实战教程

本篇博客我会演示日常的工作中&#xff0c;我们是怎么利用nginx部署项目的。我们以部署一套前后分离的项目为本次讲述的内容 一、搭建后端项目 创建一个最简单的springboot项目&#xff1a; 只需要依赖一个web模块即可&#xff1a; 提供一个api接口&#xff0c;可以获取服务端…

周记之马上要答辩了

“ 要变得温柔和强大&#xff0c;就算哪天突然孤身一人&#xff0c;也能平静地活下去&#xff0c;不至于崩溃。” 10.16 今天提前写完了一篇六级阅读&#xff0c;积累了一些词组&#xff1a; speak out against 公然反对&#xff0c;印象最深刻的就这个&#xff1b; 先了解…

英语——分享篇——每日200词——3001-3200

3001——ascertain——[ˌsəteɪn]——vt.查明&#xff0c;弄清——ascertain——a苹果(编码)s美女(编码)certain确定(熟词)——吃苹果的美女确定已查明此事——It can be difficult to ascertain the facts. ——可能难以查明事实真相。 3002——disrupt——[dɪsrʌpt]——…

深入浅出:Python内存管理机制详解

文章目录 一、什么是内存&#xff1f;1.1、RAM简介1.2、RAM容量1.3、查看电脑内存1.4、监控电脑内存 二、内存管理2.1、python是如何分配内存的&#xff1f;2.2、python采用自动内存管理机制2.3、python自动内存管理机制的缺点2.4、python内存优化的方法 三、项目实战3.1、查看…

防雷检测的项目和行业的等级区分

防雷检测是指对雷电防护装置的性能、质量和安全进行检测的活动&#xff0c;是保障人民生命财产和公共安全的重要措施。 地凯科技防雷检测的项目内容包括接闪器检测、引下线检测、接地装置检测、防雷区的划分、电磁屏蔽防雷检测、等电位连接检测、及电涌保护器 (SPD)性能检测。…

软件打不开,文件找不到了,如何找到隐藏文件?(windows和mac解决方案)

相信大家在学习过程中&#xff0c;会在咱们自己的编程软件安装一些插件&#xff0c;但是我们要知道插件跟版本会有不兼容的情况出现&#xff0c;也就是非法插件&#xff0c;会导致软件打不开&#xff0c;打开了报错等问题。 这个时候它的报错会告诉你一些路径&#xff0c;但是有…

vue3传递prop踩坑

这是官方文档中的介绍&#xff1a; Vue3中文官网 我们在组件中定义props时推荐使用驼峰命名&#xff0c;但是在父组件中传递数据时要使用kebab-case形式 这是我写的loading组件中定义的几个porps 我在使用时是这样传入的 但是打印出来的值是&#xff1a; 可以看到这里的ou…

CMMI V2.0能力域

1、概念 能力域是一组相关的PA&#xff0c;可以提高组织或项目的技能和活动的性能。能力域视图是CMMI模型的一个子集&#xff0c;描述了构成特定能力域的一组预定义PA。能力域是一种视图。如下面规划和管理工作能力域视图&#xff1a; 2、类别 类别是相关能力域的逻辑组或视图…

【html+css】袁进 渡一

文章目录 1. pre标签的原理2. img和map元素结合3. 元素的包含关系4. em单位5. 选择器5.1 简单选择器5.2 选择器组合5.3 选择器并列 6. 层叠7. 继承8. 属性值的计算过程9. 盒模型9.1 盒子类型9.2 盒子组成部分 10. 盒模型的应用10.1 改变宽高范围10.2 改变背景覆盖范围10.3 溢出…

经销商低价数据品牌如何掌握

渠道是由品牌、经销商、消费者组成&#xff0c;每个品牌的发展&#xff0c;离不开良好的渠道规则&#xff0c;一切不利于渠道发展的因素都应及时治理&#xff0c;比如产品假货、经销商低价等&#xff0c;低价除了影响渠道发展&#xff0c;还会带来很多问题&#xff0c;如品牌窜…

Unity 最新DOTS系列之《Baking与Baker的详解》

Unity DOTS Baking与Baker详解 最近DOTS终于发布了正式的版本, 我们来分享一下DOTS里面Baking 与Baker的关键概念&#xff0c;方便大家上手学习掌握Unity DOTS开发。 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;希望大家可以点击进来一起交流一下开发经验呀&…

CleanMyMac X靠谱苹果电脑杀毒软件

在过去&#xff0c;人们普遍认为苹果电脑不容易受到病毒和恶意软件的攻击&#xff0c;因此不需要安装杀毒软件。然而&#xff0c;随着苹果电脑的普及和互联网的发展&#xff0c;苹果电脑也逐渐成为黑客和恶意软件的目标。为了保护苹果电脑的安全&#xff0c;使用一款可靠的苹果…

进程中的任务状态解析

在 Linux 里面&#xff0c;无论是进程&#xff0c;还是线程&#xff0c;到了内核里面&#xff0c;我们统一都叫任务&#xff08;Task&#xff09;&#xff0c;由一个统一的结构 task_struct 进行管理。 每一个任务都应该有一个 ID&#xff0c;作为这个任务的唯一标识。到时候排…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)十三:通用表格组件封装实现

一、本章内容 本章实现通用表格组件,根据实体配置自动实现表格列识别、数据搜索、表格排序、添加、编辑、删除等操作功能。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频 3.1 B站视频地址:

【vSphere 8 自签名证书】企业 CA 签名证书替换 vSphere Machine SSL 证书Ⅳ—— 替换默认证书

目录 博文摘要6. 使用企业 CA 签发的 SSL 证书 替换 vSphere 默认 SSL 证书6.1 确认证书文件6.2 替换默认 vSphere 证书6.3 验证自签名证书6.4 补充说明 关联博文参考资料 博文摘要 博文主要描述了在 vCenter Server 8 上通过实用工具 certificate-manager 将 vSphere 默认 Ma…

【JUC】AQS源码剖析

AQS(AbstractQueuedSynchronizer) 文章目录 AQS(AbstractQueuedSynchronizer)1. 概述2. AQS源码分析前置知识2.1 AQS的int变量2.2 AQS的CLH队列2.3 内部类Node(Node类在AQS类内部)2.3 小总结 3. 以ReentrantLock为突破口进行AQS源码分析3.1 架构原理3.2 lock()方法3.3 AQS中的a…

CNN系列

文章目录 R-CNN&#xff08;2014&#xff09;Conclusion R-CNN&#xff08;2014&#xff09; 哈哈 创新&#xff1a; (1)人们可以将高容量卷积神经网络(cnn)应用于自下而上的区域建议&#xff0c;以定位和分割对象; (2)当标记训练数据稀缺时&#xff0c;对辅助任务进行监督预训…

vite+vue3+ts开发web日语项目,支持主题切换,pinia状态持久化管理

支持日语五十音,平片假名、罗马音、词义转换、百度翻译功能,方便日语初学者学习日语发音 介绍 采用vitevue3ts技术栈开发, pinia管理全局化。主要是为了日语入门学习五十音, 以及日语句子罗马 发音对照练习 使用: 安装 使用Npm或其他包管理器安装依赖 npm install 百度翻…