SpringBoot 自动装配原理

【SpringBoot】SpringBoot自动装配原理详解 文章目录1.什么是SpringBoot?2.初步认识Spring Boot3.Spring Boot四大核心4.Enable\* 注解的作用5.深入分析Spring Boot中的自动装配5.1简单分析@Configuration5.2简单分析@ComponentScan5.3 Import注解方式一:直接填class数组方式二:ImportSelector方式【重点】方式三:ImportBeanDefinitionRegistrar方式5.4 深入分析EnableAutoConfiguration原理5.5 阅读详情

1、预备知识

1.1 @Import注解和ImportSelector接口

通过@Import注解和配置类实现了ImportSelector接口,可以实现被@Import注解修饰的类导入覆写了ImportSelector接口中selectImports()方法返回的类的全路径名称。

下面举个例子:

package com.jerry.springbootstudy.demo;

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

/**
 * @Description: ImportSelector-demo
 * @Author: Jerry
 * @Date: 2021-05-13 22:55
 */
public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[] {
                User.class.getName(),
                Role.class.getName()
        };
    }
}

该类实现了ImportSelector接口,并复写了selectImports方法,该方法返回要自动装配到Spring容器中的类名称。这里的demo中,返回我们自己定义个User类和Role类的类名。

User:

package com.jerry.springbootstudy.demo;

/**
 * @Description: User类
 * @Author: Jerry
 * @Date: 2021-05-13 22:56
 */
public class User {
}

Role:

package com.jerry.springbootstudy.demo;

/**
 * @Description: 角色二类
 * @Author: Jerry
 * @Date: 2021-05-13 22:56
 */
public class Role {
}

Config配置类:

package com.jerry.springbootstudy.demo;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

/**
 * @Description: 配置类
 * @Author: Jerry
 * @Date: 2021-05-13 22:58
 */
@Configuration
@Import(MyImportSelector.class)
public class Config {
}

说明:

  • 通过@Import注解引入我们上面ImportSelector接口的实现类,将selectImports方法中返回的类名对应的bean装配到Spring容器中;
  • 通过@Configuration注解将config类自身装配到Spring容器中。

测试类:

package com.jerry.springbootstudy.demo;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.util.Arrays;

public class ConfigTest {
    @Test
    public void test() {
        ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
        String[] names = context.getBeanDefinitionNames();
        Arrays.stream(names).forEach(System.out::println);
    }
}

测试类中获取context容器,从容器中获取自动装配到容器中的bean名称并打印,结果如下:

结果可以看出,我们通过ImportSelector接口的实现类的selectImports方法返回的类的bean,成功装配到Spring容器中。

1.2 spring.factories中的EnableAutoConfiguration配置

在很多Spring相关的依赖的META-INF目录下都能看到spring.factories文件,比如在spring-boot-autoconfigure依赖的META-INF目录下就能看到这个文件,如图:

在该文件中的EnableAutoConfiguration配置下,就存放有该依赖中要加载到Spring容器中的bean,还是以spring-boot-autoconfigure的spring.factories为例,如下:

我们看到有rabbitmq相关的配置类,在spring-boot-autoconfigure依赖下果然能找到RabbitAutoConfiguration类,如下:

2、相关源码分析

整体流程如下图所示:

说明:

  • 通过在@EnableAutoConfiguration注解里用@Import(EnableAutoConfigurationImportSelector)注解的方式将自动装配的类加载到Spring容器中,哪些类需要加载是由AutoConfigurationImportSelector类里实现额selectImports方法返回;
  • 在selectImports方法中,最重要的方法是getCandidateConfigurations方法,该方法里主要是loadFactoryNames方法,该方法读取依赖中META-INF目录下的spring.factories文件,获取spring.factories文件中EnableAutoConfiguration配置下所有要自动装配的类的名称并返回。

3、面试说辞

  • 在SpringBoot的启动类上有一个@SpringBootApplication注解,这个注解里有一个@EnableAutoConfiguration注解;
  • @EnableAutoConfiguration注解通过@Import导入了一个EnableAutoConfigurationImportSelector类,该类实现了ImportSelector接口,实现了selectImports方法,该方法会返回需要自动装配到Spring容器中的类的名称;
  • 再看selectImports方法,该方法只要有三步:
    1. getCandidateConfigurations方法获取所有的bean;
    2. 获取@SpringBootApplication注解中execlude指定的不需要自动装配的类;
    3. 返回a中去掉b中的类。
  • 主要看getCandidateConfigurations方法,该方法里有一个loadFactoryNames方法,这个方法读取依赖中META-INF目录下的spring.factories文件,获取spring.factories文件中EnableAutoConfiguration配置下所有要自动装配的类的名称并返回。

springboot自动装配原理详解 springboot自动装配原理详解 1)传统ssm整合redis的时候 需要在xml的配置文件中 进行大量的配置Bean 我们在这里使用springboot来代替ssm的整合,只是通过xml的形式来整合redis 第一步:加入配置 <dependency> <groupId>org.springframework.data</grou... 阅读详情

相关推荐

SpringBoot 自动装配原理详解

文件,将文件中配置的类型信息加载到 Spring 容器(此处涉及到 JVM 类加载机制与 Spring 的容器知识),并执行类中定义的各种操作。没有 Spring Boot 的情况下,如果我们需要引入第三方依赖,需要手动配置,非常麻烦。即使 Spring 后面引入了基于注解的配置,我们在开启某些 Spring 特性或者引入第三方依赖的时候,还是需要用 XML 或 Java 进行显式配置。但是,Spring Boot 项目,我们只需要添加相关依赖,无需配置,通过启动下面的。

2401_86844317的博客 1094

Spring之ImportSelector接口浅析

@Import注解是将指定的Bean加入到IOC容器之中进行管理,ImportSelector接口只有一个selectImports方法,该方法将返回一个数组,也就是类实例名称,@Import 注解将会把返回的Bean加入到IOC容器中进行管理; 1.看下ImportSelector接口的源码 package org.springframework.context.annotation; imp...

OceanSky的专栏 3555

从零开始:Vivado中自定义串口通信IP核的完整实现

本文详细介绍了在Vivado中从零开始实现自定义串口通信IP核的完整流程,包括Verilog核心代码编写、仿真验证、IP核封装与参数化配置技巧。通过AXI-Lite总线实现动态配置,提升FPGA开发效率,适用于各种嵌入式系统通信需求。

weixin_29274969的博客 325

@Import注解中使用ImportSelector接口导入bean

@Import注解中使用ImportSelector接口导入bean

weixin_44230693的博客 639

【Halcon】双目立体视觉引导机械手有序抓取,案例分享

本文介绍了一个基于双目视觉的工件定位与抓取系统。该系统使用两个工业相机组成双目视觉系统,通过标定获取相机参数,采用模板匹配算法识别任意摆放且可能交叠的工件。重点阐述了三维坐标获取方法,特别是通过Z方向高度实现有序抓取的策略。文章详细说明了系统搭建、双目标定、模板创建等关键步骤,并展示了特征点匹配和定位结果。该案例为初学者和开发者提供了双目视觉系统的基本实现参考,展示了机器视觉与机械手协同工作的典型应用场景。

机器视觉从业者 2489

用STM32定时器PWM高级功能驱动步进电机:F103C8T6+TB6600实战教程

本文详细介绍了如何利用STM32F103C8T6微控制器的定时器PWM高级功能驱动TB6600步进电机驱动器,实现高效、灵活的运动控制方案。通过硬件配置、PWM参数计算、运动控制算法及TB6600高级功能应用的全面解析,为工业自动化和精密控制领域提供了实用的技术参考。

game4的博客 186

基于Spring Boot应用Java的Stream流API

记录:292 场景:Stream流操作基本步骤一般归纳为:Stream流的创建、Stream流的中间操作、Stream流的终止操作。以数据源List为例,先把List转换为Stream;在对Stream进行中间操作,比如使用Stream的filter函数筛选;最后使用Stream的forEach遍历输出结果。

zhangbeizhen18的博客 2998

R语言实战:非正态数据下的Scheirer–Ray–Hare检验全流程解析

本文详细解析了在R语言中执行Scheirer–Ray–Hare检验的全流程。当数据不满足正态分布假设时,该非参数检验是传统双因素方差分析的有效替代方案。文章从原理、R环境配置、数据准备、代码实现、结果解读到事后比较与可视化,提供了完整的实战指南,帮助研究者稳健地分析多因素实验设计中的主效应和交互效应。

cc789的博客 405

深入理解Spring的ImportSelector接口

在这里我们仿照@EnableTransactionManagement来实现自定义注解,注意使用@Import导入我们刚才写的SpringStudySelector。

CHIKA2333的博客 1322

秃鹰搜索优化算法(BES)详解:从自然捕食到全局优化

秃鹰搜索优化算法(Bald Eagle Search Optimization Algorithm,BES)是由马来西亚学者Alsattar等人于2020年提出的一种新型元启发式优化算法。该算法灵感来源于秃鹰在自然界中高超的捕食行为,特别是其独特的狩猎策略和卓越的视觉搜索能力,模拟了秃鹰捕食鲑鱼等猎物的完整过程。

qq_42212808的博客 1349

工业相机——靶面尺寸、像元尺寸、分辨率 、传感器尺寸

由Sensor对角线长度表示,单位英寸,这里的1英寸=16mm。——靶面尺寸为宽12.7mm*高9.6mm,对角线16mm。——靶面尺寸为宽8.8mm*高6.6mm,对角线11mm。——靶面尺寸为宽7.2mm*高5.4mm,对角线9mm。——靶面尺寸为宽6.4mm*高4.8mm,对角线8mm。——靶面尺寸为宽4.8mm*高3.6mm,对角线6mm。——靶面尺寸为宽3.2mm*高2.4mm,对角线4mm。——靶面尺寸为宽14*高10.5mm,对角线17mm。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 9605

Spring框架的ImportSelector到底可以干嘛

总结Spring中一个非常重要的注解`@Import`中的`ImportSelector`接口的作用以及它到底有啥作用。也会捎带一部分源码说一下`DeferredImportSelector`是干啥的,以及Spring解析这个和`ImportSelector`有什么区别。

Smallc0de的博客 4985

【AI智能体】Codex + Seedance2.5 制作AI视频实战操作详解

【AI智能体】Codex + Seedance2.5 制作AI视频实战操作详解

congge_study的博客 3763

Spring Boot自动装配原理(易懂)

熟练使用Spring Boot那么自动装配原理的掌握是必不可少的

总结分享 4万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Spring Boot的自动装配原理

自动装配是springboot的核心,一般提到自动装配就会和springboot联系在一起。实际上SpringFramework早就实现了这个功能。SpringBoot只是在其基础上,通过SPI的方式,做了进一步优化。SpringBoot定义了一套接口规范,这套规范规定SpringBoot在启动时会扫描外部引用jar包中的文件,将文件中配置的类型信息加载到Spring容器(此处涉及到JVM类加载机制与Spring的容器知识),并执行类中定义的各种操作。...

YING—country的博客 3万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

springboot自动装配原理

springboot自动装配原理

qq_24078621的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SpringBoot自动装配原理

到这里我们就可以知道当一个springboot启动类加载的时候,会根据@EnableAutoConfiguration注解找到项目依赖库中对应的需要开启自动装配的配置文件实现自动装配,这其中使用了spring的SPI机制,全名是service provide interface 服务提供接口,spring的这一机制可以然我们不局限于单独的接口进行服务实现,可以借助类或者注解。可以看到对应的key-value结构,注解以及对应的文件我们找到这个配置文件可以看到以下配置。

qq_52747920的博客 1083

SpringBoot之自动装配原理

Springboot自动装配原理 springboot自动装配 springboo最核心的东西就是自动装配原理,那么自动装装配原理是什么呢?自动装配原理其实就是对strat提供好的xxxAutoConfiguration、配置文件进行读取,当读取完后就配置好这些类。 详说springboot自动装配 ​ 进入项目后,我们发现springboot为开发者提供了一个类,类里有个run方法,看上去很简单没什么东西需要了解,但是细心的你会发现这个类上有个注解@SpringBootApplication,这个注解

qq_41343166的博客 8037

【SpringBoot】深入剖析 Spring Boot 自动装配原理(附源码与实战)

Bean而在 Spring Boot 中,这些 Bean可以不写,Spring Boot 会自动装配合适的 Bean。例如,添加依赖后,Spring Boot 会自动配置DataSource但我们从未在代码中显式定义它!假设我们希望 Spring Boot在项目启动时自动装配一个自定义的 HelloService,而无需手动配置 Bean,我们可以按照以下步骤实现。如果不想让某些自动配置生效,可以使用exclude或者在Spring Boot 通过和加载中的自动配置类。自动配置类使用。

工一木子 1411

springboot 自动装配_Spring Boot自动装配原理分析

阅读本文约需要10分钟大家好,我是你们的导师,经常看我朋友圈的同学应该知道,我每天会在微信上给大家免费提供以下服务!1、长期为你提供最优质的学习资源!2、给你解决技术问题!3、每天在朋友圈里分享优质的技术文章!4、每周1、3、5送纸质书籍免费送给大家,每年至少送书800本书!5、为大家推荐靠谱的就业单位!请注意!我上面说的5点全部都是免费的!全网你应该找不到第二家吧!当然,大家...

weixin_39984442的博客 166

Springboot自动装配原理

Spring Boot 的自动装配机制大大简化了应用配置的工作,它通过条件注解和大量的默认配置,帮助开发者自动配置常见的功能(如数据源、Web 服务器等)。通过理解自动装配的原理,开发者可以更加灵活地定制自己的应用配置,同时也可以在需要时禁用某些自动装配功能。

sunyingboaini的博客 1085

【原理分析】细说SpringBoot的自动装配原理

1.什么是SpringBoot?   对于spring框架,我们接触得比较多的应该是spring mvc、和spring。而spring的核心在于IOC(控制反转对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系)和DI(依赖注入IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了

波波烤鸭的博客 14万+

Springboot自动装配的原理

第三方jar包,SpringBoot会采用SPI机制,在/META-INF/目录下增加spring.factories文件,然后SpringBoot会自动根据约定,自动使用SpringFactoriesLoader来加载配置文件中的内容。这种自动装配的思想在spring3.x以后就支持了,我们只需要在类上添加一个叫做@Enable的注解就可以了,只是spring没有向SpringBoot这样全面去设计,这样设计的好处,在于大幅度减少了臃肿的配置文件,而各模块之间的依赖,也深度的解耦,...

blanceage的博客 1万+

SpringBoot自动装配原理详解

SpringBoot 自动装配原理超详细解答

m0_51431003的博客 6729
上一篇: Java队列-queue
下一篇: iOS之一个 HTTP 超时问题论述
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值