1024程序员节特辑:【Spring Boot自动配置原理揭秘】

news2024/9/20 5:46:39

自动配置原理

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

在这里插入图片描述

主页传送门:📀 传送

概述


  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);
    }
}

复合Annotation


  @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


  @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


  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/1123257.html

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

相关文章

.rancher-pipeline.yml

一、注意点 其实下文二的image是基于这个镜像作为基础镜像在这个镜像中执行打包&#xff0c;shellScript 当前路径是你代码块与上图settings.xml&#xff0c;图中的settings.xml可以替换下你当前镜像的settings.xml 示例 二、.rancher-pipeline.yml ${CICD_GIT_BRANCH}这些从官…

天下苦定制久矣,平台化建设到底难在哪里?

为什么需要平台 随着业务的不断发展&#xff0c;软件系统不可避免的走向熵增&#xff1a;复杂度越来越高、研发效率越来越差、稳定性逐渐降低等。这时抽象核心能力&#xff0c;走向平台化的道路成为很多系统的首要选择 平台的建设目标 产品的核心价值在于其有效性和用户体验…

视频号视频如何下载(WeChatVideoDownloader)

背景介绍 最近需要一个视频号里面的视频进行宣传用&#xff0c;网上找了很多方法都不行&#xff0c;特别是下载抓包工具Fiddler&#xff0c;然后监控HTTPS请求的&#xff0c;截取URL把URL中20302改成20304&#xff0c;再用IDM工具下载对应的资源&#xff0c;最后修改后缀名.mp…

《红蓝攻防对抗实战》三.内网探测协议出网之HTTP/HTTPS协议探测出网

目录 一. 在 Windows 操作系统中探测 HTTP/HTTPS 出网 1. Bitsadmin 命令 2.Certuil 命令 2.Linux系统探测HTTP/HTTPS出网 1.Curl命令 2.Wget命令 对目标服务器探测 HTTP/HTTPS 是否出网时&#xff0c;要根据目标系统类型执行命令&#xff0c;不同类型的操作系统使用的探…

GeoServer改造Springboot源码一(公共部分)

今天开始开启关于GeoServer的一个全新系列,主要是把改造Springboot后的详细代码粘贴出来,此文应配合《GeoServer改造Springboot启动》系列共同阅读,按照前系列的时间顺序结合此系列的源码展示可以快速构建GeoServer功能的二次封装的后端系统。 一、Springboot部分源码结构 …

NC资金管理相关问题

1、差旅费借款单支付单位是另外一家公司&#xff0c;审批后自动签字&#xff0c;审批时报错是为什么&#xff1f;报错信息是&#xff1a;没有当前资源的操作权限。 答&#xff1a;用户没有结算节点支付单位的权限&#xff0c;所以当无权限进行自动签字。 2、收付款单在结算节点…

如何破解压缩包密码,CTF压缩包处理

I. 引言 压缩包我们经常接触&#xff0c;用于对文件进行压缩存储/传输。压缩包处理在CTF比赛中是非常重要的一块&#xff0c;因为压缩包中可能包含重要信息&#xff1a;许多CTF题目会将关键信息隐藏在压缩包中&#xff0c;参赛者需要解压并查看其中的内容才能获取有用的线索。…

自动巡查、自动换充电……浙江这两台无人机“巢穴”派大用场

浙江省积极探索利用高科技的无人机技术提高森林防火效率。在杭州市西湖区的西山国家森林公园和绍兴市柯桥区的大香林风景区&#xff0c;部署了两台复亚智能全自动无人机飞行系统&#xff0c;实现了火情的自动检测、定期自动巡查以及迅速响应。该技术的应用标志着杭州从传统的“…

设计院图纸加密防泄密方案——天锐绿盾加密软件@德人合科技

天锐绿盾是一款专业的企业信息化防泄密软件&#xff0c;主要针对文档全生命周期进行加密保护&#xff0c;包括创建、修改、传输、归档、分发、销毁等全过程。它可以加强外发数据及终端离线的管理&#xff0c;对正常授权外带范围内的数据流程进行规范。设计图纸、文档等成果数据…

2023年英特尔on技术创新大会深度解析

在北京时间9月19日23&#xff1a;35分&#xff0c;Intel在美国加州圣何塞举办了2023英特尔on技术创新大会。在会议上&#xff0c;Intel相关负责人进行发言&#xff0c;并阐释了本次会议的三大重点内容&#xff0c;分别为Intel Meteor Lake架构概览&#xff0c;Intel 4制程工艺与…

安卓sd卡格式化数据恢复方法,您了解吗

随着智能手机的广泛使用&#xff0c;SD卡作为一种存储扩展设备&#xff0c;已经成为了安卓手机用户的必备之选。然而&#xff0c;当SD卡意外格式化&#xff0c;存储在其中的重要数据也会随之消失。那么&#xff0c;安卓SD卡格式化后数据丢失怎么办&#xff1f;本文将介绍安卓SD…

leetcode 21

递归的方式 class Solution { public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {if(l1 nullptr){return l2;}else if(l2 nullptr){return l1;}else if(l1->val < l2->val){l1->next mergeTwoLists(l1->next, l2);return l1;}else if(l1->va…

通讯网关软件029——利用CommGate X2MQTT实现MQTT访问DDE数据源

本文介绍利用CommGate X2MQTT实现MQTT访问DDE数据源。CommGate X2MQTT是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;实现上位机通过MQTT来获取DDE数据源的数据。 【解决方案】设置网关机&…

StarCCM+引入第三方库,找不到的错误

StarCCM里自定义的宏文件是在Star里编译运行的&#xff0c;第三方库需要单独引用。工具->options->环境->用户宏类路径 点进去以后&#xff0c;一定要注意多个jar包是写在一行的&#xff0c;不要主动换行。

6款好用到爆的神级电脑软件,个个让人相见恨晚,堪称办公必备

你的电脑上有哪些好用到爆的神级电脑软件&#xff1f;今天就给大家分享6款好用到爆的神级电脑软件&#xff0c;个个让人相见恨晚&#xff0c;堪称办公必备。 1、PDF工具&#xff1a;PDF24 Tools PDF24 Tools是一款强大而多功能的PDF工具集合&#xff0c;提供了许多便捷的功能&a…

Shopee买家通系统一款批量注册虾皮买家号软件

如果想要大量的虾皮买家号&#xff0c;那么可以使用shopee买家通系统进行全自动化的注册&#xff0c;这款软件在注册时可以自动输入手机号、自动接收短信并输入、自动设置密码等&#xff0c;方便又快速。 shopee买家通系统支持多个国家使用&#xff0c;可以用于菲律宾、印度尼西…

CVer从0入门NLP(一)———词向量与RNN模型

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;专栏推荐&#xff1a;深度学习网络原理与实战 &#x1f34a;近期目标&#xff1a;写好专栏的每一篇文章 &#x1f34a;支持小苏&#xff1a;点赞&#x1f44d;&#x1f3fc;、…

操作系统——死锁及其解决方案(p38-p41王道视频、课本ch6)

1.死锁的“知识框架”&#xff1a; 2.“预防死锁”——破坏死锁的4个必要条件: 3.避免死锁&#xff01;&#xff01;&#xff01;&#xff01;——必考&#xff1a;银行家算法 安全性算法描述&#xff1a; 4.“死锁的检测和解除”:

leetcode:231. 2 的幂(位运算)

一、题目&#xff1a; 函数原型&#xff1a;bool isPowerOfTwo(int n) 二、思路&#xff1a; 根据题意&#xff0c;要判断一个数是否为2的幂。如果一个数是2的幂&#xff0c;那么该数的二进制表示中只有一个1。所以只需要将该数的二进制表示中的最低位1移除&#xff0c;判断剩下…

永磁体的温度稳定性:剩磁温度系数、矫顽力温度系数、可逆温度系数

永磁体一般是作为磁场源&#xff0c;在一定的空间内来提供恒定磁场&#xff0c;对于一些精密的仪器仪表和磁性器件来说&#xff0c;磁体磁场的稳定性至关重要&#xff0c;它会直接影响仪器的精度和可靠性。 但是&#xff0c;在外界条件如&#xff1a;温度、时间、电磁场、机械…