SpringBoot自动装配原理--------@SpringBootApplication注解

SpringBoot自动装配原理分析,比如@SpringBootApplication注解,@SpringBootConfiguration注解,@EnableAutoConfiguration注解 SpringBoot自动装配原理分析,比如@SpringBootApplication注解,@SpringBootConfiguration注解,@EnableAutoConfiguration注解,@AutoConfigurationPackage注解,metadata(元空间),loadSpringFactories方法,WebMvcAutoConfiguration注解等。 阅读详情

本文主要讲解@SpringBootApplication注解的一个底层原理,也就是springboot启动类的那个注解,run()方法会在下一篇文章进行讲解。

1.什么是SpringBoot?

SpringBoot是一个能够快速开发应用的一个框架,它简化了基于 Spring 的应用开发,通过少量的代码就能创建一个独立的、产品级别的 Spring 应用。为 Spring 平台及第三方库提供开箱即用的设置,它的核心思想就是约定大于配置,其中的应用只需要很少的 Spring 配置,就能够直接使用。这样就大大的简化了你的开发模式。

2.SpringBoot的自动装配原理

启动类:

@SpringBootApplication
public class ApplicationTest {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationTest.class);
    }
}

点开@SpringBootApplication注解,你会看到如下代码,说明该注解是一个组合注解,虽然有多个注解,但是最主要的注解就是以下三个:
@SpringBootConfiguration(里面应用了@Configuration)
@EnableAutoConfiguration
@ComponentScan

@Target(ElementType.TYPE)            // 注解的适用范围,其中TYPE用于描述类、接口(包括包注解类型)或enum声明
@Retention(RetentionPolicy.RUNTIME)  // 注解的生命周期,保留到class文件中(三个生命周期)
@Documented                          // 表明这个注解应该被javadoc记录
@Inherited                           // 子类可以继承该注解
@SpringBootConfiguration             // 继承了Configuration,表示当前是配置类
@EnableAutoConfiguration             // 开启springboot的注解功能,springboot的四大神器之一,其借助@import的帮助
@ComponentScan(excludeFilters = {    // 扫描路径设置(具体使用待确认)
    @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
    @Filter(type=FilterType.CUSTOM,classes=AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
...
}

所以说你用这个三个注解来代替@SpringBootApplication注解,你的启动类也是可以启动的。

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class ApplicationTest {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationTest.class);
    }
}

接下来讲解各个注解的含义。

2.1 SpringBootConfiguration注解:

@SpringBootConfiguration注解点开查看发现里面应用了@Configuration注解

@Configuration:
1.这里的@Configuration,它就是JavaConfig形式的Spring Ioc容器的配置类所使用的那个注解@Configuration,SpringBoot社区推荐使用基于JavaConfig的配置形式,所以,这里的启动类标注了@Configuration之后,它本身也是一个IoC容器的配置类。

2.配置spring容器有两种方式,一种是javaConfig形式,一种是XML配置文件形式。

javaConfig形式:

任何一个标注了@Configuration的Java类定义都是一个JavaConfig配置类
任何一个标注了@Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器,方法名将默认成该bean定义的id。

@Configuration
public class UserConfiguration{
    @Bean
    public UserService userService(){
        return new UserServiceImpl();
    }
}

xml形式:

<bean id="userService" class="UserServiceImpl">
...
</bean>

2.2 @ComponentScan注解:

1.它对应XML配置中的元素,@ComponentScan的功能其实就是自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中。

2.我们可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则Spring框架默认会从声明@ComponentScan所在类的 package下进行扫描。

3.所以SpringBoot的启动类最好是放在root package下,因为默认不指定basePackages。

2.3 @EnableAutoConfiguration:

该注解也是一个组合注解,主要是用到@AutoConfigurationPackage和@Import,这两个注解

  1. @AutoConfigurationPackage:
    这个注解主要是通过@Import(AutoConfigurationPackages.Registrar.class)注解,它将Registrar类导入到容器中,而Registrar类作用是扫描主程序类同级包以及子级包,将同级包及所有子包下的 组件 放到spring容器中

以下是源码:

static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
     @Override
      public void registerBeanDefinitions(AnnotationMetadata metadata,
        BeanDefinitionRegistry registry) {
             register(registry, new PackageImport(metadata).getPackageName());
        }

new PackageImport(metadata).getPackageName()方法,它其实返回了当前主程序类的同级以及子级的包组件

  1. @Import(AutoConfigurationImportSelector.class):
    该注解主要是通过导入AutoConfigurationImportSelector 类,借助该类中重写了父类的一个方法,名为selectImports( ),这个方法它先通过@EnableAutoConfiguration的类路径
    org.springframework.boot.autoconfigure.EnableAutoConfiguration作为查找的Key,从classpath中搜寻所有的META-INF/spring.factories配置文件,来获取value值,值就是一组@Configuration自动配置类,然后通过反射(Java Refletion)实例化为对应 的标注了@Configuration的IoC容器配置类,然后汇总为一个并通过SpringFactoriesLoader来进行一系列的容器创建过程。
    下图为 AutoConfigurationImportSelector类的继承关系:
    在这里插入图片描述

可以从图中看出 AutoConfigurationImportSelector 继承了 DeferredImportSelector 继承了 ImportSelector
而ImportSelector有一个方法为:selectImports( )。

下图为 selectImports( )方法的源码:

@Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        if (!isEnabled(annotationMetadata)) {
            return NO_IMPORTS;
        }
        AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
        AnnotationAttributes attributes = getAttributes(annotationMetadata);
        List<String> configurations = getCandidateConfigurations(annotationMetadata,attributes);
        configurations = removeDuplicates(configurations);
        Set<String> exclusions = getExclusions(annotationMetadata, attributes);
        checkExcludedClasses(configurations, exclusions);
        configurations.removeAll(exclusions);
        configurations = filter(configurations, autoConfigurationMetadata);
        fireAutoConfigurationImportEvents(configurations, exclusions);
        return StringUtils.toStringArray(configurations);
    }

可以看到方法中第六行代码,getCandidateConfigurations(annotationMetadata,attributes);
从classpath中搜寻所有的META-INF/spring.factories配置文件。这个外部文件,有很多自动配置的类。
如下图:
在这里插入图片描述

该文件可以在spring-boot-autoconfigure.jar包中的MATE-INF找到

  1. 其实在这些配置类中都有类似@Conditional注解,像@ConditionalOnClass的含义是指定的类必须存在于类路径下,
    比如:MongoDB的自动配置类
    MongoDataAutoConfiguration类中声明了类路径下必须含有Mongo.class, Mongo Template.class这两个类,否则该自动配置类不会被加载。
DLPFC.h5ad格式数据简便获取方式+STAGATE论文复现问题 简便获取DLPFC.h5ad格式的数据方式 阅读详情

相关推荐

基于PID算法的循迹小车

这一期为创客们带来基于PID算法的循迹小车制作 1.标准赛道示意图: (该赛道包含了:左直角、右直角、十字路口等路况) 2.灰度传感器安装示意图: (可根据实际情况调节各传感器之间的间距) 3.硬件原理图: 4.控制逻辑: 5.程序如下: #define leftA_PIN 7 #define leftB_PIN 6 #define left_Pwm_PIN 5 #define STBY...

qq_44343584的博客 4万+

SpringBoot:自动化装配功能(@SpringBootApplication注解详解)

SpringBoot:自动化装配功能(@SpringBootApplication注解详解)

jpkopkop的博客 1060

Cadence OrCAD: 层次化设计 Hierarchical Design

详细介绍OrCAD的原理图层次化设计方法。

Fantasy237的博客 1万+

Springboot的自动装配解读

Springboot java

qq_43649937的博客 8717

卡尔曼滤波五步拆解:用Excel手推姿态解算全过程

本文通过Excel手推演示,详细拆解了卡尔曼滤波在姿态解算中的五步核心流程。文章以融合陀螺仪与加速度计数据估算角度为例,从状态预测、协方差更新到增益计算,逐步展示如何将抽象的矩阵运算转化为可视化的表格计算,帮助读者直观理解滤波器的“预测-修正”机制,并为算法实现与参数调优提供清晰指导。

hhh00的博客 984

STM32串口调试踩坑记:HAL_UART_ErrorCallback里不先解锁,你的中断接收就废了

本文深入分析了STM32串口调试中HAL_UART_ErrorCallback的锁机制陷阱,指出在错误回调中不先解锁会导致中断接收失效的问题。通过解析HAL库源码,提出了正确的错误处理实现方法,并分享了预防措施与最佳实践,帮助开发者提升串口通信的可靠性。

weixin_33733810的博客 516

SpringBoot常用注解及自动装配原理

通常用于启动类上,让SpringBoot自动给程序进行必要的配置,其组合包含3个注解@SpringBootConfiguration:组合了@Configuration注解,实现配置文件的功能。@EnableAutoConfiguration打开自动配置功能也可以关闭某个自动配置的选项。 如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class });

weixin_63588450的博客 2356

超频玩家必看:TestMem5配置文件详解与内存稳定性测试实战(含黄金参数包)

本文详细解析了TestMem5(TM5)在内存超频稳定性测试中的核心价值与实战应用,特别针对DRAM颗粒特性提供黄金参数配置。通过anta777等专业配置的深度剖析,指导超频玩家精准定位内存故障,优化时序参数,实现性能与稳定性的完美平衡。涵盖从初级验证到极限压测的全流程方案,是硬件发烧友提升系统稳定性的必备指南。

weixin_29198045的博客 1825

springboot中一些实现自动配置注解标签

EnableAutoConfiguration 是利用SpringFactoriesLoader 机制加载自动装配配置的,它的配置数据在META-INF/spring.factories 中,我们打开 spring-boot-autoconfigure jar 中的该文件,发现对应着许多个 XXXAutoConfiguration 配置类.是作用在方法上的 , 方法中会产生一个对象,最终把此对象交给spring容器管理,注意此对象返回值就需要是你需要是spring管理的对象。名称,也就是小写的名称。

weixin_52394141的博客 1042

从零开始搭建企业级安全扫描平台:基于Docker的Greenbone和ClamAV部署指南

本文提供了一份基于Docker容器技术,从零开始搭建企业级安全扫描平台的实战指南。详细介绍了如何部署和集成漏洞扫描工具Greenbone与病毒扫描工具ClamAV,涵盖架构设计、Docker环境优化、容器化部署步骤以及平台集成与监控方案,帮助企业构建自动化、可扩展的安全防御核心组件。

delta的博客 759

GPS定位不准?可能是GDOP在作怪!手把手教你优化卫星几何分布

本文深入解析了GPS定位精度不佳的常见原因——几何精度因子GDOP。通过剖析卫星几何分布对定位误差的放大效应,文章提供了从理解GDOP、PDOP、HDOP等关键指标,到使用专业APP实时诊断卫星天空图,再到利用在线工具提前规划最佳定位时机的完整实战指南。旨在帮助户外爱好者、无人机飞手及专业用户主动优化卫星几何条件,从而显著提升定位可靠性。

weixin_29062823的博客 306

SpringBoot自动装配原理详解

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

m0_51431003的博客 6730

记二开金蝶云星空动态表单艰辛历程

整个过程,开发接近一周,期间也有做其他事,遇到不会的第一时间也是找金蝶社区,搜索有无相关的解决问题经历。再就是问同事,最终还不能解决就提工单给供应商。响应一般都要大半天(我们公司是有vip,相对大半天能够响应是算好了),虽然有时候有响应,但是会转到其他研发老师,期间可能会是几天!如果是经常开发云星空的二开功能,熟练了速度回很快,但是对于接触不多的,或者刚入门的,会是个漫长的折磨过程。1、重新生产模块的dll.2、退出客户端3、重启iis4、等待五六分钟5、附加到进程6、登录客户端进去操作。

修炼中 3941

SpringBoot(Ⅱ)——@SpringBootApplication注解+自动装配原理+约定大于配置

maven的默认目录结构也体现了约定大于配置的思想。

敢问路在何方,路在脚下 1186

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Spring Boot自动装配原理:@SpringBootApplication注解背后的Bean扫描与条件装配(距离收官倒计时6)

本文深入解析SpringBoot自动装配机制的核心原理。通过分析@SpringBootApplication注解(包含@Configuration、@ComponentScan和@EnableAutoConfiguration三大功能)揭示自动装配入口,阐述spring.factories文件作为配置注册表的作用,以及@Conditional系列注解实现条件装配的逻辑。文章通过手写Demo演示自定义自动配置流程:创建配置类、注册到spring.factories、验证条件装配,直观展现"按需加载&

huahua8088的博客 1087

计算机控制技术及应用

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

SpringBoot自动装配原理

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

qq_52747920的博客 1083

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

SpringBoot之自动装配原理

SpringBoot的核心理念是简化Spring应用的搭建和开发过程,提出了和的思想。开发Spring项目通常要配置xml文件,当项目变得复杂的时候,xml的配置文件也将变得极其复杂。为了解决这个问题,我们将一些常用的通用的配置先配置好,要用的时候直接装上去,不用的时候卸下来,这些就是SpringBoot框架在Spring框架的基础上要解决的问题。只需要在SpringBoot默认的配置文件application.yaml中配置redis连接信息就可以直接自动注入操作redis的Bean。...

m0_67400973的博客 1092

springboot中必须要了解的自动装配原理

🏇学习SpringBoot\textcolor{Orange}{学习SpringBoot}学习SpringBoot 🙏学习过程中的笔记,方便查阅学习\textcolor{green}{学习过程中的笔记,方便查阅学习}学习过程中的笔记,方便查阅学习💗 🍣如果在其中需要我的源码,可以私聊我\textcolor{green}{如果在其中需要我的源码,可以私聊我}如果在其中需要我的源码,可以私聊我🍣 欢迎各位小伙伴😄关注👍点赞⭐️收藏📝留言 自动装配原理1.pom.xml2.启动器3.主程序3.1注解3.2 s.

奔走的王木木Sir的博客 1144

springboot自动装配原理的了解

springboot自动装配原理欢迎打开这篇文章1,spring中bean注入的三种形式1.1setter注入1.2构造器注入1.3属性注入2,Spring的两种配置方式2.1基于xml的配置2.2基于JavaConfig类的配置3,BeanDefinition4,BeanDefinition结构4.1 beanClass4.2autowireMode4.3constructorArgumentValues 欢迎打开这篇文章 学习SpringBoot,绝对避不开自动装配这个概念,这也是SpringBoot的

qq_54516125的博客 571

SpringBoot高频面试题TOP20:注解原理与自动装配考点精讲

Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的配置方式,从而使开发人员不再需要定义样板化的配置。通过 Spring Boot,我们可以快速构建出独立运行、生产级别的 Spring 应用程序。

梵心白莲的博客 1071

Spring源码解析(19)之refresh(7)-SpringBoot自动装配原理

一、前言 我们这上一节中主要是介绍了ConfigurationClassPostProcessor,有没有细心的人发现,我们@Import注解的解析源码还没有分析,这一节我们来具体分析。 还有在面试的时候想必大家都有被问到过SpringBoot的自动装配原理,这里结合@ ConfigurationClassPostProcessor,以SpringBoot自动装配开始分析我们@Import注解是如何解析的,并且说一说SpringBoot的自动装配原理。 首先来看下Spr...

jokeMqc的博客 906

springboot自动装配

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

好好玩的博客 4万+

Springboot自动配置原理

Springboot自动配置原理

qq_45443475的博客 971

说一下 SpringBoot 的自动装配原理

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

程序员三木的博客 287

SpringBoot笔记01-自动装配原理及运行原理

IDEA建了一个springboot项目后点开pom.xml会发现如下一个父项目: <!-- 有一个父项目--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.5</version> <relati

weixin_44919186的博客 190
上一篇: mysql数据库索引底层原理---------B+树(内附原理图)
下一篇: SpringBoot启动原理--------run()方法详细讲解
AY_G
博客等级 码龄7年 330粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值