当前位置: 首页 > news >正文

【源码解析】SpringBoot自动装配的实现原理

什么是SpringBoot的自动装配

SpringBoot在启动的时候会扫描外部jar包中的META-INF/spring.factories文件,将文件中配置的类信息按照条件装配到Spring容器中。
在这里插入图片描述

实现原理

核心注解@SpringBootApplication

@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 {
  • @Target指定注解的作用范围
  • @Retention指定注解的保留策略
  • @Documented该注解会被文档化
  • @Inherited父类的注解能够被子类继承
  • @SpringBootConfiguration把 @Configuration 注解做一个包装。
  • @ComponentScan指定扫描的策略
  • @EnableAutoConfiguration实现自动装配的核心注解

@EnableAutoConfiguration

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";Class<?>[] exclude() default {};String[] excludeName() default {};
}

AutoConfigurationImportSelector#selectImports,获取到配置的类集合。

    public String[] selectImports(AnnotationMetadata annotationMetadata) {if (!this.isEnabled(annotationMetadata)) {return NO_IMPORTS;} else {AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());}}

AutoConfigurationImportSelector#getAutoConfigurationEntry,读取META-INF/spring.factories,获取配置类的集合,并进行合理的过滤。

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);}
}protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");return configurations;}

Spring Boot 通过@EnableAutoConfiguration开启自动装配,通过 SpringFactoriesLoader 最终加载META-INF/spring.factories中的自动配置类实现自动装配,自动配置类其实就是通过@Conditional按需加载的配置类,想要其生效必须引入spring-boot-starter-xxx包实现起步依赖。

相关文章:

【源码解析】SpringBoot自动装配的实现原理

什么是SpringBoot的自动装配 SpringBoot在启动的时候会扫描外部jar包中的META-INF/spring.factories文件&#xff0c;将文件中配置的类信息按照条件装配到Spring容器中。 实现原理 核心注解SpringBootApplication Target({ElementType.TYPE}) Retention(RetentionPolicy.R…...

详解ROS时间戳

ROS&#xff08;Robot Operating System&#xff09;是一个用于机器人开发的开源软件框架&#xff0c;其中涉及到了一些与时间相关的概念和工具&#xff0c;如时间戳、计时器等。本文将主要介绍ROS中时间戳的概念和应用&#xff0c;并提供一个Python代码案例演示如何处理ROS时间…...

Android Window、WindowManager

1.窗口Window 在Android中显示一个界面,首先想到的是Activity、Dialog或Toast。但是在有些情况下,比如悬浮球,用Activity会显然多余,这个时候可以直接使用窗口来实现。 Android中所有的视图都是通过Window来呈现的,不管是Activity、Dialog还是Toast,它们的视图实际上都…...

【一天一门编程语言】怎样设计一门编程语言?

怎样设计一门编程语言&#xff1f; 确定目标 确定语言的用途&#xff1a; 是一门通用编程语言&#xff0c;还是一门专门面向某个特定目标的语言&#xff1f;是一门面向对象的语言&#xff0c;还是一门过程化的语言&#xff1f;将语言的最终用户定义为谁&#xff1f; 确定语言…...

微服务保护 -- 初识 Sentinel(雪崩问题,快速入门Sentinel)

大家好&#xff0c;今天我们要来学习阿里巴巴开源的流量控制和熔断降级框架 – Sentinel 。 1、雪崩问题及解决方案 首选我们来了解一下雪崩问题及其解决方案&#xff0c;我们学习这个微服务保护&#xff0c;其实就是为了去应对类似于雪崩问题这样的服务故障。 1.1 什么是雪…...

软件测试面试问答

笔试 笔试的话我们需要揣测具体会考什么内容&#xff0c;我们可以通过招聘信息去了解该公司需要什么样的技能&#xff0c;以此来准备笔试。一般必考的内容会有编程&#xff0c;测试用例设计&#xff0c;工作流程&#xff0c;逻辑思维等内容&#xff0c;除此之外每个公司可能还会…...

【架构】架构师的核心能力-抽象能力

文章目录一、通过归纳法找共性二、通过演绎法找关系三、通过归纳法找特性四、最后架构的核心是管理复杂度&#xff0c;架构师的核心能力是抽象能力&#xff0c;什么是抽象能力&#xff1f;抽象能力就是一种化繁为简的能力。何为化繁为简&#xff1f;就是把一种复杂的事情变得简…...

前端一面常见react面试题(持续更新中)

React 组件中怎么做事件代理&#xff1f;它的原理是什么&#xff1f; React基于Virtual DOM实现了一个SyntheticEvent层&#xff08;合成事件层&#xff09;&#xff0c;定义的事件处理器会接收到一个合成事件对象的实例&#xff0c;它符合W3C标准&#xff0c;且与原生的浏览器…...

亥姆霍兹线圈测量系统

亥姆霍兹线圈[Helmholtz线圈]是指由具有相同线圈匝数、相同线圈绕制方式且线圈半径等于线圈间距的一对或者多对线圈构成的线圈组合。 根据线圈的形状&#xff0c;亥姆霍兹线圈可分为圆形亥姆霍兹线圈和方形亥姆霍兹线圈&#xff1b;根据磁场方向&#xff0c;亥姆霍兹线圈可分为…...

JavaScript 类型转换

Number() 转换为数字&#xff0c; String() 转换为字符串&#xff0c; Boolean() 转化为布尔值。JavaScript 数据类型在 JavaScript 中有 5 种不同的数据类型&#xff1a;stringnumberbooleanobjectfunction3 种对象类型&#xff1a;ObjectDateArray2 个不包含任何值的数据类型…...

Spring Batch 综合案例实战-项目准备

目录 案例需求 分析 项目准备 步骤1&#xff1a;新开spring-batch-example 步骤2&#xff1a;导入依赖 步骤3&#xff1a;配置文件 步骤4&#xff1a;建立employee表与employe_temp表 步骤5&#xff1a;建立基本代码体系-domain-mapper-service-controller-mapper.xml …...

STM32CubeMX串口USART中断发送接收数据

本文代码使用 HAL 库。 文章目录前言一、中断控制二、USART中断使用1. 中断优先级设置 &#xff1a;2. 使能中断3. 使能UART的发送、接收中断4. 中断收发函数5. 中断处理函数6. 中断收发回调函数三、串口中断实验串口中断发送数据点亮 led&#xff1a;实验现象&#xff1a;总结…...

JavaScript Web Workers使用流程

背景 Web Workers是一个API&#xff0c;允许在浏览器中运行后台处理任务&#xff0c;而不影响用户界面&#xff08;UI&#xff09;线程的稳定性。 Web Workers 可用于消除阻止 UI 的耗时任务&#xff0c;如图表生成&#xff0c;物理模拟或数据分析等&#xff1a; 使用 Web W…...

数据结构与算法(五):优先队列

这节总结一下优先队列的常用实现方法。 一、基本概念 普通的队列是一种先进先出的数据结构&#xff0c;元素在队列尾追加&#xff0c;而从队列头删除。在优先队列中&#xff0c;元素被赋予优先级。当访问元素时&#xff0c;具有最高优先级的元素最先删除。优先队列具有最高级…...

二叉树的前序遍历-java两种方式-力扣144

一、题目描述给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。示例 1&#xff1a;输入&#xff1a;root [1,null,2,3]输出&#xff1a;[1,2,3]示例 2&#xff1a;输入&#xff1a;root []输出&#xff1a;[]示例 3&#xff1a;输入&#xff1a;root [1]输出…...

浅析 Redis 主从同步与故障转移原理

我们在生产中使用 Redis&#xff0c;如果只部署一个 Redis 实例&#xff0c;当该实例宕机&#xff0c;到恢复之前都不可用&#xff1b;虽说 Redis 一般都用来做缓存&#xff0c;但不可用给业务系统带来的影响也是不小的&#xff0c;流量大时甚至会导致整个服务宕机。所以 Redis…...

MyBatis学习笔记(七) —— 特殊SQL的执行

7、特殊SQL的执行 7.1、模糊查询 模糊查询的三种方式&#xff1a; 方式1&#xff1a;select * from t_user where username like ‘%${mohu}%’ 方式2&#xff1a;select * from t_user where username like concat(‘%’,#{mohu},‘%’) 方式3&#xff1a;select * from t_u…...

计算机组成原理(1)--计算机系统概论

一、计算机系统简介1.计算机系统软硬件概念计算机系统由“硬件”和“软件”两大部分组成。所谓“硬件”&#xff0c;是指计算机的实体部分&#xff0c;它由看得见摸得着的各种电子元器件&#xff0c;各类光、电、机设备的实物组成&#xff0c;如主机、外部设备等。所谓“软件”…...

jdbc模板的基本使用

1.JdbcTemplate的开发步骤 <1>导入spring-jdbc和spring-tx坐标 <2>创建数据库表和实体 <3>创建JdbcTemplate对象 <4>执行数据库 2.JdbcTemplate快速入门 <1>导入坐标 <dependency><groupId>org.springframework</groupId><…...

JPA 注解及主键生成策略使用指南

JPA 注解 Entity 常用注解 参考&#xff1a;JPA & Spring Data JPA学习与使用小记 指定对象与数据库字段映射时注解的位置&#xff1a;如Id、Column等注解指定Entity的字段与数据库字段对应关系时&#xff0c;注解的位置可以在Field&#xff08;属性&#xff09;或Prope…...

sequelize-typescript不同外键场景,实现一对一数据映射的Model处理

在 NestJS 中使用 sequelize-typescript 时&#xff0c;如果数据库表中没有建立物理的外键约束&#xff08;Foreign Key Constraint&#xff09;&#xff0c;但在业务逻辑上存在一对一的关系&#xff0c;你完全可以通过在代码层面&#xff08;ORM 层&#xff09;定义关联来解决…...

程序设计语言 —计算机等级考试—软件设计师考前备忘录—东方仙盟

章节&#xff1a;程序设计语言 → 程序语言分类就在程序语言基础那一大块&#xff0c;专门分 4 大类&#xff1a;命令式&#xff08;过程式&#xff09;语言函数式语言逻辑式语言面向对象语言你刷题没翻到&#xff0c;是因为一般教材把它放在&#xff1a;编译原理 / 程序设计语…...

Arduino与CircuitPython通过SPI Flash和FATFS实现数据无缝交换

1. 项目概述与核心价值在嵌入式开发领域&#xff0c;数据存储与交换一直是个绕不开的经典话题。无论是记录传感器数据、保存设备配置&#xff0c;还是实现固件的在线更新&#xff0c;我们都需要一个可靠、高效且易于管理的存储方案。SPI Flash芯片以其小巧的体积、低廉的成本和…...

晨芯阳HC9616带防止逆流功能,500mA高速LDO

HC9616是一系列高精度&#xff0c;低功耗LDO线性稳压器&#xff0c;内部集成防止逆流保护功能、短路保护&#xff0c;过流保护等功能。输出具有高精度、低噪声、高纹波抑制比、低压差等特点&#xff0c;输出可使用小型陶瓷电容&#xff0c;良好的线性和负载调整特性。且具有使能…...

从零基础到实战精通:2026最新大模型学习路线指南

在AI技术飞速迭代的今天&#xff0c;大模型已从实验室走向产业落地&#xff0c;成为驱动各行业变革的核心引擎&#xff0c;广泛应用于智能办公、代码开发、智能交互、垂直行业解决方案等多个场景。对于渴望提升竞争力的职场人、程序员&#xff0c;或是对AI感兴趣的初学者而言&a…...

SAST 静态代码分析平台命令行接口介绍(终结篇)

下面软件工厂生成的报告展示&#xff0c;可以根据客户需要定制。特别说明&#xff0c;下面图中的所有数据均是虚构数据&#xff0c;仅仅是为了做图展示。1、扫描覆盖与项目分布2、漏洞总览和项目红黑榜3、按语言统计和项目修复趋势4、合规性分析5、人员缺陷统计和型号版本质量趋…...

从零开始设计智能体的系统提示

写了137版系统提示之后&#xff0c;我总结出的这套“认知框架设计法”2019年我刚开始接触对话系统的时候&#xff0c;写系统提示&#xff08;System Prompt&#xff09;是一件特别简单的事。你打开OpenAI的Playground&#xff0c;在“System”那个框里写上一段话&#xff0c;比…...

iOS 18.2提前发布:AI深化、RCS集成与开发者适配全解析

1. 项目概述&#xff1a;一次不寻常的OTA更新如果你是苹果生态的深度用户&#xff0c;或者是一名移动应用开发者&#xff0c;那么最近一周你的神经可能被一条消息牵动着&#xff1a;苹果公司一反常态&#xff0c;将原定于2025年初推送的iOS 18.2操作系统&#xff0c;提前到了今…...

GB/T 4857.2-2005 全解析|运输包装件温湿度调节处理标准完整版

前言GB/T 4857.2-2005《包装 运输包装件基本试验 第 2 部分&#xff1a;温湿度调节处理》是国内包装测试最基础、最核心的环境预处理标准&#xff0c;等效采用 ISO 2233:2000&#xff0c;替代旧版 GB/T 4857.2-1992。所有运输包装做跌落、压力、振动、冲击等测试前&#xff0c;…...

ClaudeDot:本地化AI对话管理工具的设计与实现

1. 项目概述&#xff1a;ClaudeDot 是什么&#xff0c;以及它解决了什么问题如果你和我一样&#xff0c;日常重度依赖 Claude 这类 AI 助手进行编程、写作和头脑风暴&#xff0c;那你一定遇到过这样的场景&#xff1a;在浏览器里开了无数个 Claude 对话标签页&#xff0c;每个标…...