SpringBoot——自动装配原理(干货)

【死磕SpringBoot】59篇干货总结一次拿下SpringBoot! 关注了很多技术类公众号的读者肯定有这样一个感受,SpringBoot相关的文章铺天盖地,并且SpringBoot相关的文章阅读量、收藏量都很高,这也从侧面反映了SpringBoot技术的火爆。 一切都在证明,SpringBoot已经成为了Java程序员必备的技能。并且可以预见的是未来SpringBoot的发展还会更好,说SpringBoot是当今最重要的Java框架也不为过。 具体来说,SpringBoot的设计目的是用来简化Spring应用的初始搭建以及开发过程,默认帮我们做了很多“地下工作”,是.. 阅读详情

深入理解SpringBoot——自动装配原理(干货)


面试官:谈谈你对Springboot自动装配的了解叭

回答:

  • 在编写SpringBoot项目时,@SpringBootApplication是最常见的注解了,我们可以看一下里面的源代码:

在这里插入图片描述

  • 这里面包含了:
  1. @SpringBootConfiguration
    • 我们点进去通过源码得知他是一个@Configuration,所以也就是对spring原生注解的封装
  2. @EnableAutoConfiguration
  3. @ComponentScan
    • 默认扫描的是与该类同级的类或者同级包下的所有类,是spring的原生注解之一

@EnableAutoConfiguration(重头戏——自动装配核心)

  • 一旦加上此注解,那么将会开启自动装配功能,简单点讲,Spring会试图在自己的classpath(类路径)下找到所有配置的Bean然后进行装配。
  • 装配Bean时,会根据若干个(Conditional)定制规则来进行初始化。我们看一下它的源码:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 该接口主要是为了导入@Configuration的配置项,而DeferredImportSelector是延期导入,当所有的@Configuration都处理过后才会执行。
  • 回过头来我们看一下AutoConfigurationImportSelector的自动配备核心方法 selectImport
//自动装配的方法
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
   if (!isEnabled(annotationMetadata)) { //判断是否自动装配
      return NO_IMPORTS;
   }
   AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
   return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}

protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
   if (!isEnabled(annotationMetadata)) {
      return EMPTY_ENTRY;
   }
   //获取所有元数据信息
   AnnotationAttributes attributes = getAttributes(annotationMetadata);
   //获取所有加载bean的条件配置
   List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
   //过滤并删除掉重复的bean
   configurations = removeDuplicates(configurations);
   Set<String> exclusions = getExclusions(annotationMetadata, attributes);
   checkExcludedClasses(configurations, exclusions);
   configurations.removeAll(exclusions);
   configurations = getConfigurationClassFilter().filter(configurations);
   fireAutoConfigurationImportEvents(configurations, exclusions);
   return new AutoConfigurationEntry(configurations, exclusions);
}
  • 该方法刚开始会先判断是否进行自动装配,而后会从META-INF/spring-autoconfigure-metadata.properties读取元数据与元数据的相关属性,紧接着会调用getCandidateConfigurations方法:
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
   List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
         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;
}
  • 在这里又遇到我们的老熟人了–SpringFactoryiesLoader, 它会读取META-INF/spring.factories下的EnableAutoConfiguration的配置,紧接着在进行排除与过滤,进而得到需要装配的类。最后让所有配置在META-INF/spring.factories下的AutoConfigurationImportListener执行AutoConfigurationImportEvent事件,代码如下:
private void fireAutoConfigurationImportEvents(List<String> configurations,
            Set<String> exclusions) {
        List<AutoConfigurationImportListener> listeners = getAutoConfigurationImportListeners();
        if (!listeners.isEmpty()) {
            AutoConfigurationImportEvent event = new AutoConfigurationImportEvent(this,
                    configurations, exclusions);
            for (AutoConfigurationImportListener listener : listeners) {
                invokeAwareMethods(listener);
                listener.onAutoConfigurationImportEvent(event);
            }
        }
    }

    protected List<AutoConfigurationImportListener> getAutoConfigurationImportListeners() {
        return SpringFactoriesLoader.loadFactories(AutoConfigurationImportListener.class,
                this.beanClassLoader);
    }

总结:

自动装配还是利用了SpringFactoriesLoader来加载META-INF/spring.factoires文件里所有配置的EnableAutoConfgruation,它会经过exclude和filter等操作,最终确定要装配的类

nginx206报错视频文件,说一下springboot启动时的自动装配过程 前言 现在刷抖音经常可以看到一些老外街坊,问他们最想把什么带回自己的国家,我听过很多的回答都是:淘宝,支付宝,美食,微信,外卖,高铁等等。 确实如此,随着国家的快速发展吸引了不少国际上羡慕的目光,更让中国的新四大发明走向世界。说到这些,都离不开背后庞大的互联网体系的支撑,阿里作为国内最顶级的互联网企业必然也聚集了行业内顶级的IT人才。 众所周知,阿里巴巴的主要开发语言就是Java,而对于Java开发者来说,最重要的就是学习Spring框架了。现在,我想跟大家分享出这份老外看外都不禁赞叹的《阿里技术官Spri 阅读详情

相关推荐

SpringBoot 4 实战教程:30分钟快速上手与核心原理深度解析

Spring Boot 作为 Java 领域主流的快速应用开发框架,其核心在于通过自动装配和约定大于配置的理念,极大简化了基于 Spring 的应用程序搭建和部署流程。其工作原理是通过起步依赖和条件注解,自动配置项目所需的 Bean 和组件,从而让开发者能够专注于业务逻辑而非繁琐的配置。这一技术价值在于显著提升了开发效率,降低了企业级应用的门槛,广泛应用于 Web 服务、微服务、数据访问和系统集成等场景。本文聚焦于 SpringBoot 4 这一最新版本,通过剖析一套高效的实战视频教程,深入讲解如何快速集成

weixin_26763955的博客 324

springboot自动装配

文章目录1、自动装配是什么及作用2、spring自动装配的原理2.1、启动类上注解的作用@SpringBootApplication@SpringBootConfiguration@EnableAutoConfiguration@AutoConfigurationPackage@Import(AutoConfigurationImportSelector.class)@ComponentScan2.2、springboot自动装配的流程3、相关注解的作用@Conditional 1、自动装配是什么及作用 s

好好玩的博客 4万+

想在瑞芯微RK3588上跑视频分类模型?避开3D卷积这个坑,试试这几种NPU友好的方案

本文探讨了在瑞芯微RK3588上部署视频分类模型时如何避开3D卷积的性能陷阱,提供了三种NPU友好的替代方案:MobileNetV2+GRU组合、Temporal Shift Module(TSM)和帧级池化。这些方案在保持较高准确率的同时,充分利用RKNPU的硬件加速能力,显著提升推理效率。文章还分享了从模型转换到部署优化的完整流程和实战经验。

weixin_28724319的博客 418

springBoot自动装配

为了简化配置,使spring的使用更加方便,例如:可以回忆一下springboot中是如何继承redis的。使用springboot后集成常用的第三方框架变得非常简单了。springboot starter带来的问题starter使SpringBoot集成第三方框架变得简单,但对刚刚上手SpringBoot的人来说,可能只知道配置属性是在application.xml或application.yml中添加,但他们各自的属性都有哪些,具体怎么配置,却无从下手。

qq_62898618的博客 1万+

CVAT本地部署保姆级教程:用Docker Compose在Ubuntu上5分钟搞定你的私有数据标注平台

本文提供CVAT本地部署的保姆级教程,详细讲解如何在Ubuntu系统上使用Docker Compose快速搭建私有数据标注平台。从环境准备、Docker配置到CVAT部署全流程,涵盖硬件要求、性能优化及安全加固等关键步骤,帮助开发团队5分钟内完成高效、安全的标注环境搭建。

weixin_42619742的博客 383

Sentaurus TCAD建模:宽温区n型FinFET模型校准与低温仿真分析

本文基于Sentaurus TCAD平台,建立了n型FinFET的宽温区(233K-393K)仿真模型,解决了低温(73K-193K)仿真失效问题。研究对比了Sprocess工艺仿真与SDE几何建模两种方法,分析了载流子冻析效应、不完全电离和迁移率退化等低温物理机制。通过优化模型参数,实现了在233K、313K和393K条件下仿真误差小于10%,并建立了符合物理趋势的低温外推模型。研究提供了完整的Sentaurus TCAD代码实现,包括器件结构定义、物理模型配置和温度相关参数校准,为宽温区FinFET仿真

huanghm88的专栏 264

Springboot自动装配

自动装配是springboot的核心,一般提到自动装配就会和springboot联系在一起。实际上 Spring Framework 早就实现了这个功能。Spring Boot 只是在其基础上,通过 SPI 的方式,做了进一步优化。

纯洁的小魔鬼 5098

Vue3 + 高德地图实现车辆电子围栏监控与报警

通过本文的实现,我们完成了一个通用的车辆电子围栏监控功能:支持多种围栏类型。支持进入/离开/双向报警。使用缓存机制避免重复告警。可与Vue3 + 高德地图无缝集成。在实际项目中,可以结合WebSocket 实时定位,实现车辆的实时监控 + 围栏告警系统🚀。

专注于前端开发与实战技巧,记录从零到一的学习与项目经验。分享 Vue3 / JavaScript / TypeScript / Flutter /Uniapp等前端技术,以及 性能优化、工程化、最佳实践。 1035

springBoot的自动装配

5、在解析@Import注解的时候,会有一个getImport()方法,从主类开始递归解析注解,把所有包含@Import的注解都解析到,然后在processImport()方法中对import的类进行分类,例如AutoConfigurationImportSelect归属于ImportSelect的子类,在后续的过程中会调用DeferredImportSelectorHandler类里面的process方法,来完成整个EnableAutoConfiguration的加载。

HongSuShouyu的博客 2709

【WorkBuddy专栏39】零基础也能做小程序——WorkBuddy微信小程序开发完全指南

【WorkBuddy专栏39】零基础也能做小程序——WorkBuddy微信小程序开发完全指南

AI人人懂 3152

融合双主干网络提升YOLOv8性能一种基于SOTA思想的目标检测改进

YOLOv8采用了单一的主干网络进行特征提取,通常是基于CSPDarknet作为骨干网络,在目标检测过程中通过不同的卷积层提取不同尺度的信息。虽然这种设计在大多数应用场景下表现出色,但在面对复杂背景、细节丰富的物体或小物体检测时,YOLOv8有时难以保持良好的精度。在本文中,我们提出了一种基于双主干网络的YOLOv8改进方案,通过结合先进的SOTA思想,全面提升了YOLOv8在目标检测任务中的表现。双主干网络架构。

博客 1154

spring自动装配原理

spring

DQWERww的博客 8020

【CUDA编程部署教程】第一章:GPU架构与CUDA编程核心 1

我们将剖析现代GPU的计算心脏——流式多处理器(SM),理解其独特的Warp执行模型,探索Tensor Core带来的革命性矩阵运算加速,并深入探讨决定性能命脉的内存体系。当必须访问全局内存时,则必须遵循**合并访问(Coalesced Access)**的原则,即让一个Warp内的32个线程访问连续的内存地址,从而让硬件将多次访问合并为一次高效的内存事务,以充分利用带宽。SM的调度器以Warp为单位分派指令,在一个Warp内,所有32个线程在同一时刻执行完全相同的指令,但处理的数据不同,这种模型被称为。

VectorShift的博客 221

SpringBoot自动装配的原理

总的来说,这个方法是Spring Boot自动配置流程的核心部分,它负责确定哪些自动配置类应该被加载,以及哪些应该被排除。这个过程涉及到注解解析、条件检查、去重、过滤等多个步骤,以确保自动配置既准确又高效。

YYVeryGood的博客 1283

【ESP 保姆级教程】第三方库篇 ——TimeLib库,一个非常Nice的时间库,结合第三方进行校正时间

Time,这是一个为Arduino提供时间支持的库。 这个库的例子中会教会我们多种方式去获取时间: - 一个`RTC`时钟 - 网络`NTP`时间 - `GPS`时间

单片机菜鸟哥的博客 3674

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

死磕Spring,什么是SPI机制,对SpringBoot自动装配有什么帮助

1. SPI是一个机制,流程由三个组件构成ServiceLoader,就是ClassLoader;Service,是接口,作为文件(在META-INF/services目录下)的名称ServiceProvider,是接口的实现类,作为文件(在META-INF/services目录下)的内容2. SPI执行流程ServiceLoader通过classpath路径,加载指定的Service文件,然后使用里面合适的内容ServiceProvider。

m0_46638350的博客 2398

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

SpringBoot自动装配串讲

本文假设读者已经有了Spring和SpringBoot的使用基础。全文一万多字,深入探讨了源码的设计模式、模块之间的关系以及容易混淆的细节。通过剖析自动装配机制的前因后果,由浅入深的看看SpringBoot主要做了些什么事。【期间还发现了一个让人忽视的Maven特性】都是干货,无关紧要以及说了也让人记不住的繁琐过程基本都被省略了。如果觉得文章太长,可以只看总结。如果觉得总结的还有点意思,再往前看。StringBoot主要就是实现了一个自动装配功能。通过添加starter的方式,让用户快速使用组件。

yunduanyou的博客 730

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

HoRain云--SpringBoot 自动装配

本文介绍了SpringBoot自动配置的原理与实现。主要内容包括:1)自动配置机制,通过@EnableAutoConfiguration注解实现依赖Jar包的自动配置;2)配置示例演示了如何自动配置DispatcherServlet、数据源等组件;3)调试方法,包括开启日志调试和使用Actuator监控;4)通过H2数据库和JPA的实例展示自动配置效果。文章还提供了禁用特定自动配置类的方法,并详细说明了从项目创建到运行测试的完整步骤,帮助开发者深入理解SpringBoot的自动配置功能。

2401_86544677的博客 778

【看过来】根据SpringBoot自动装配原理, 手把手教你手写一个starter组件!

点击上方蓝色“java大数据修炼之道”,选择“设为星标”每晚九点: 技术干货 ???? 必定奉上springboot作为java开发者不得不提的一个框架,其中也是有许多配置可以减轻开发者的工作量。简化了Bean对象注入到IoC容器中的流程(自动装配),配置文件的统一管理。比如自动装配,引入一个starter就可以实现了,大大减少了代码量,使得coder专注于业务代码。自动装配原理首先你需要去熟悉SPI...

hello world! 105

springboot干货——(二)原理解析

前言 上一章我们介绍了Spring Boot的优势以及如何通过Spring Boot来急速创建一个web项目,不过对于其内部的运行原理我们还没有介绍,这对于日常使用问题不大,不过对于以后从用轮子到造轮子这步会吃很大的亏,因此本章博主通过互联网找来一些资料,和大家一起学习。   正文 首先来看下Spring Boot项目中的运行类,基本上每个项目都会有该启动类: @SpringBootA...

东天里的冬天 1919

[特殊字符]【MyBatis-Plus源码解析】第九章:深入内核,揭秘框架设计原理(SQL注入器/MetaObject/自动装配)

嘿,各位对技术有极致追求的“源码控”们,我是默语 👨‍💻!欢迎来到我们《MyBatis-Plus保姆级教程》系列的最终封神篇——第九章:源码深度解析!前面的章节,我们学会了如何“使用”MP的十八般武艺,但你是否曾好奇:为什么继承`BaseMapper`就拥有了CRUD能力?`@TableField`的自动填充是如何精准工作的?`mybatis-plus-boot-starter`是如何“一键”完成所有配置的?🤔 本章,我们将化身技术侦探,手持“放大镜”深入MP的源码内核,为你逐一揭开这些“黑魔法”的神

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 4017

SpringBoot面试干货

IOC容器、JavaConfig、事件监听、SpringFactoriesLoader详解。

qq_43409401的博客 571

SpringBoot自动配置、启动器原理爆肝解析(干货满满)

本文详细解析面试重点—SpringBoot自动配置原理、场景启动器原理,深入源码,直接上干货、绝不拖泥带水。

F & F的博客 861

项目经理说干货(三):Springboot常见面试题

“项目经理说干货”系列是本人结合多年开发与面试专家经验,梳理而成的重要的、常考的、容易失分的知识点,供大家参考;当今企业程序员面试,犹如千军万马过独木桥,只有“知其然知其所以然”,方可成功上岸。 在 Java 开发领域,Springboot 作为当前主流的轻量级框架,在企业级应用开发中广泛使用。对于开发者而言,掌握 Springboot 相关知识是求职过程中的重要环节。以下将从多个方面梳理 Springboot 常见的面试问题,帮助求职者更好地备考。​一、核心概念相关问题​1. Sp

qq_20294455的博客 843

Java面试技巧:SpringBoot与Redis实战解析

Java作为企业级开发的主流语言,其技术栈的深度与广度直接影响面试表现。SpringBoot通过自动装配机制简化了配置,核心原理涉及@EnableAutoConfiguration注解和条件装配,这种设计模式显著提升了开发效率。Redis作为高性能缓存数据库,在分布式系统中解决并发与数据一致性问题,其跳跃表实现和持久化策略是面试高频考点。结合当前热词SpringBoot和Redis,本文通过典型场景拆解,展示如何从原理层理解技术价值,并应用于电商订单系统等实际业务场景,帮助开发者构建扎实的Java知识体系与

weixin_33970449的博客 429

SpringBoot的注解总结,这绝对是一篇满满的干货!

目录注解(Annotations)列表@SpringBootApplication@Configuration@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan@Component@AutoConfigurationPackage@ConfigurationPropertiesScan@EnableConfigurationProperties@ConfigurationProperties@AutoConfigureAfter@Au

weixin_43246215的博客 6710
下一篇: SpringBoot是什么?干嘛用的?(新手入门篇)
指陆为码
博客等级 码龄6年 41粉丝 18原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

指陆为码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值