@SpringBootApplication注解源码学习

关于springboot中的@SpringBootApplication注解 @SpringBootApplication 是 Spring Boot 的核心入口注解,其设计体现了“约定优于配置”的理念,通过以下方式大幅简化开发: 组合注解:集成配置、自动配置和组件扫描功能,减少样板代码。 智能推断:基于依赖和类路径动态配置应用,减少手动干预。 灵活性:支持自定义扫描范围和覆盖默认配置,适应复杂场景。 阅读详情

@SpringBootApplication

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {}

@ComponentScan

这个注解作用:排除或者加载或者自定义过滤规则将自定义的类,加入到Spring容器中

@EnableAutoConfiguration

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

重点是:
在这里插入图片描述

AutoConfigurationImportSelector 类

这个类的父类的父类是:ImportSelector。主要 接口是 selectImports。也就是说,重点看 AutoConfigurationImportSelector#selectImports

看方法:

	@Override
	public String[] selectImports(AnnotationMetadata annotationMetadata) {
	// 是否开启自动注入,否的话,返回一个空数组
		if (!isEnabled(annotationMetadata)) {
			return NO_IMPORTS;
		}
		// 获取要 被spring 容器,管理的javaBean。先从 META-INF/spring.factories 加载之后,经过一系列操作,完成 Spring容器的初始化
		AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
		return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
	}

getAutoConfigurationEntry 方法

Entry–中文,入口的意思

/**
	 * Return the {@link AutoConfigurationEntry} based on the {@link AnnotationMetadata}
	 * of the importing {@link Configuration @Configuration} class.
	 * @param annotationMetadata the annotation metadata of the configuration class
	 * @return the auto-configurations that should be imported
	 */
	protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
		if (!isEnabled(annotationMetadata)) {
			return EMPTY_ENTRY;
		}
		// 1-获取注解属性,若获得的是null,将抛出异常
		AnnotationAttributes attributes = getAttributes(annotationMetadata);
		//2-去得到 下META-INF/spring.factories 定义的类实例(一般较多,需要经过后续去重,去排除,过滤等操作)
		List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
		//3- 去重
		configurations = removeDuplicates(configurations);
		//4-得到要排除的集合
		Set<String> exclusions = getExclusions(annotationMetadata, attributes);
		//5-检查排除的类
		checkExcludedClasses(configurations, exclusions);
		//5-去掉排除的类
		configurations.removeAll(exclusions);
		//6-过滤。重点
		configurations = getConfigurationClassFilter().filter(configurations);
		//7-
		fireAutoConfigurationImportEvents(configurations, exclusions);
		//8-
		return new AutoConfigurationEntry(configurations, exclusions);
	}

1-getAttributes方法

protected AnnotationAttributes getAttributes(AnnotationMetadata metadata) {
		String name = getAnnotationClass().getName();
		AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(name, true));
		Assert.notNull(attributes, () -> "No auto-configuration attributes found. Is " + metadata.getClassName()
				+ " annotated with " + ClassUtils.getShortName(name) + "?");
		return attributes;
	}

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

重点:SpringFactoriesLoader类
这个是:读取,spring.factories文件,并实例化,最终要放到IOC容器中
把这jar 下的 META-INF/spring.factories,key = EnableAutoConfiguration的进行实例化!

在这里插入图片描述

public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {
		ClassLoader classLoaderToUse = classLoader;
		if (classLoaderToUse == null) {
			classLoaderToUse = SpringFactoriesLoader.class.getClassLoader();
		}
		String factoryTypeName = factoryType.getName();
		return loadSpringFactories(classLoaderToUse).getOrDefault(factoryTypeName, Collections.emptyList());
	}

	private static Map<String, List<String>> loadSpringFactories(ClassLoader classLoader) {
		Map<String, List<String>> result = cache.get(classLoader);
		if (result != null) {
			return result;
		}

		result = new HashMap<>();
		try {
			Enumeration<URL> urls = classLoader.getResources(FACTORIES_RESOURCE_LOCATION);
			while (urls.hasMoreElements()) {
				URL url = urls.nextElement();
				UrlResource resource = new UrlResource(url);
				Properties properties = PropertiesLoaderUtils.loadProperties(resource);
				for (Map.Entry<?, ?> entry : properties.entrySet()) {
					String factoryTypeName = ((String) entry.getKey()).trim();
					String[] factoryImplementationNames =
							StringUtils.commaDelimitedListToStringArray((String) entry.getValue());
					for (String factoryImplementationName : factoryImplementationNames) {
						result.computeIfAbsent(factoryTypeName, key -> new ArrayList<>())
								.add(factoryImplementationName.trim());
					}
				}
			}

			// Replace all lists with unmodifiable lists containing unique elements
			result.replaceAll((factoryType, implementations) -> implementations.stream().distinct()
					.collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList)));
			cache.put(classLoader, result);
		}
		catch (IOException ex) {
			throw new IllegalArgumentException("Unable to load factories from location [" +
					FACTORIES_RESOURCE_LOCATION + "]", ex);
		}
		return result;
	}

6-过滤

点进去方法

List<String> filter(List<String> configurations) {
			long startTime = System.nanoTime();
			String[] candidates = StringUtils.toStringArray(configurations);
			boolean skipped = false;
			for (AutoConfigurationImportFilter filter : this.filters) {
				// 重点:看autoConfigurationMetadata
				boolean[] match = filter.match(candidates, this.autoConfigurationMetadata);
				for (int i = 0; i < match.length; i++) {

是个内部类。看构造器
去load “META-INF/spring-autoconfigure-metadata.properties”; 这个文件的内容
在这里插入图片描述
这个文件很大。
举个例子
在这里插入图片描述

// configurations 在过滤之前是 270个 。过滤之后,只有 120个了
configurations = getConfigurationClassFilter().filter(configurations);

万象RK3506-EG1800网关使用说明 摘要:HD-RK3506-EG1800是一款高性能工业物联网边缘计算网关,支持Buildroot和Ubuntu双系统。文档详细介绍了网关的网络配置(包括ETH0/ETH1的静态IP设置、WiFi连接)、时钟同步、HSL软件安装配置(含开机自启动服务)、系统日志优化以及刷机操作指南(Loader/Maskrom模式)。特别提供了基于lighttpd的网页管理方案,通过HTML界面实现网络参数可视化配置,包含身份验证、实时状态显示和表单提交功能。网关默认ETH0固定IP为192.168.1.10,提供完整的CL 阅读详情

相关推荐

在 dell precision 7920 tower CentOS 8 Stream 上安裝nvidia驱动程序、Anaconda

简单记录一下如何在实验室dell precision 7920 tower CentOS 8 Stream上安装nvidia显卡驱动。

chen9046的博客 994

@SpringBootApplication剖析

定义一个Spring Bean是在类上加上注解@Service、@Controller、@Compent就可以,而Spring是通过扫描@CompoentScan指定包下所有加了注解的类,如果不写它只会加载启动类所在的包及下级包。@SpringBootConfiguration组合了@Configuration,它是用来声明当前类是一个配置类,被注解类的内部包含一个或多个@Bean注解的方法,用于替换xml配置定义,这些方法将被。简单例子:直接使用@Configuration和@Bean来注入容器。

程序员青菜学厨记 393

VCS的增量和分离编译

vcs的增量和分离编译

yunduor909的博客 3302

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

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

jpkopkop的博客 1059

UA-DETRAC数据集转YOLO格式

UA-DETRAC转YOLO

lafsca5的博客 9107

RustFS vs MinIO:深入对比分布式存储的性能、功能与选型指南

RustFS与MinIO是两款热门分布式存储系统,分别针对高性能与通用场景设计。RustFS基于Rust语言,在吞吐量(最高提升46%)、延迟(降低37%)和资源效率(内存占用减少67%)上显著优于MinIO,适合AI训练、金融级应用等高性能需求。MinIO凭借成熟的S3兼容性、云原生集成和企业级功能,更适用于混合云及现有S3生态。许可方面,RustFS采用Apache 2.0,MinIO为AGPLv3。选型建议:优先RustFS应对性能敏感场景,选择MinIO注重生态兼容性,也可考虑混合架构策略。

分布式存储与RustFS的博客 2022

Springboot核心注解(@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan)、关闭自动配置、自动配置原理等。

一、核心注解 @SpringBootApplication:组合注解,包括以下注解。 @SpringBootConfiguration: 配置注解,底层其实也是@Configuration注解,只不过在SpringBoot工程中更推荐使用@SpringBootConfiguration来替代Configuration。 @EnableAutoConfiguration: 启动自动配置,根据所依赖的Jar包自动配置相关配置项。(后续会继续解释) @ComponentScan: 扫描

IT学习小镇 2290

FPGA+滨淞CCD实战:手把手教你搭建S7031/S10142成像电路(附避坑指南)

本文详细介绍了使用FPGA驱动滨淞CCD传感器(S7031/S10142)构建高精度成像系统的完整实战流程。内容涵盖核心器件选型、系统架构规划、电路板(焦面板与接口板)设计要点、FPGA Verilog逻辑实现,并提供了从电源管理、信号调理到数据采集的详细避坑指南,帮助读者从零搭建稳定可靠的成像电路。

weixin_29271263的博客 227

@SpringBootApplication详解

@SpringBootApplication注解原理: @SpringBootApplication: Spring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就应该运行这个类的main方法来启动SpringBoot应用; 进入该注解,有两个重要的注解:@SpringBootConfiguration 、@EnableAutoConfiguration 一、@SpringBootConfiguration @SpringBootConfigurat.

cai_ing的博客 2110

ROS2入门到精通—— 1-1 Linux和ROS2基础

本文介绍了Linux的一般指令以及ROS2的常见理论和操作

BigDavid123的博客 3799

软考高级网络规划设计师教程(第3版)

"本书是由工业和信息化部教育与考试中心组织编写的考试用书,依据《网络规划设计师考试大纲》(2026年审定通过)编写。本书分为两篇:第一篇为网络规划与设计综合知识,其中第1章介绍计算机网络基础知识,第2章介绍网络互连与互联网,第3章介绍网络规划与设计的知识和方法,第4章介绍网络资源设备,第5章介绍网络安全技术,第6章介绍标准化和网络安全法规;第二篇为案例实践,其中第7章介绍网络规划案例,第8章介绍网络故障分析与处理案例,第9章介绍网络安全部署案例,第10章介绍网络规划与设计论文写作的指导思想和写作技巧。

鹿鸣天涯 3933

SpringBoot源码(二):@SpringBootApplication注解(自动配置原理)

① SpringBoot 的自动装配机制会试图根据你所添加的依赖来自动配置你的 Spring 应用程序。例如,你添加了 HSQLDB 依赖,而且你没有手动配置任何 DataSource Bean,那么SpringBoot就会自动配置内存数据库。 ② 自动配置是**非侵入性**的。 在任何时候,你都可以自定义配置来取代自动配置的特定部分。 例如,如果你添加了你自己的 DataSource bean,默认的嵌入式数据库支持就会 "退步",从而让你的自定义配置生效。 ③ 如果你想禁用掉项目中某些自动装配类,你

mrguif的博客 1190

FPGA实现串口升级及MultiBoot(九)BPI FLASH相关实例演示

与SPI相关知识并没有什么太多区别(别杠硬件或者架构上),相关知识点都在上面指出,大家有什么其他需要注意点,欢迎留言讨论。关于“四样错误”就不演示了,没什么太大区别,下一讲我们开始串口升级。PS:为了扩展ICAPE2原语的使用,在原来的基础上增加了几个常用FPGA ID,并在触发启动时候增加了可选电平触发或上升/下降沿触发(例化IP时选择),新版本号V1.1。

OpenFPGA的博客 1444

【Spring Boot 源码学习】@SpringBootApplication 注解

本篇介绍 @SpringBootApplication 注解的相关内容

Huazie 2002

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Spring源码学习:@SpringBootApplication注解和自动装配原理学习

目录前言1 @SpringBootApplication注解分析1.1 @SpringBootConfiguration1.2 @EnableAutoConfiguration1.2.1 @AutoConfigurationPackage1.2.2 @Import(AutoConfigurationImportSelector.class)1.3 @ComponentScan2 源码解析3 处理流程图4 测试 前言 我们在启动类使用该注解可以自动完成springboot项目的自动处理注解,自动导入各种依赖包

qq_36566262的博客 459

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Spring Boot3零基础教程,@SpringBootApplication 注解详细说明,笔记63

Spring Boot3零基础教程,@SpringBootApplication 注解详细说明,笔记63

道友 330

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

springboot注解详解(三)容器配置注解与Spring Boot注解

什么是ActiveMQ?ActiveMQ服务器宕机怎么办?丢消息怎么办?持久化消息非常慢怎么办?消息的不均匀消费怎么办?死信队列怎么办?ActiveMQ中的消息重发时间间隔和重发次数吗?

2401_84097964的博客 1139

Spring Boot 入门详细分析(2)

最后,这个 demo 中还涉及到几个注解,挨个说一下。@SpringBootApplication 作用有三点1、启动 Spring Boot 的自动配置机制,作用等同于 @EnableAutoConfiguration。2、扫描包及其子包下的组件,作用等同于 @ComponentScan。学习分享,共勉这里是小编拿到的学习资源,其中包括“中高级Java开发面试高频考点题笔记300道.pdf”和“Java核心知识体系笔记.pdf”文件分享,内容丰富,

2301_82242670的博客 78

springCould,springBoot以及mybatis项目框架构建《一》

项目背景       博主的公司一直处于亏损,年初的时候很不幸被裁员了,但是这家公司使用的技术是springcould+boot的微服务式架构,鉴于公司的业务是自研APP产品的,用到的东西都是比较新的,可能在项目架构的设计之初,架构师也是按照需求来设计的。这里只有后端的架构及其由本人参照项目结构简化版的代码,主要是供大家参考学习使用。前端部分就不多叙述,以及APP客户端和后端的验签还有加密,Fil...

Mr_xiatian的博客 1415

深入学习Springboot的注解@SpringBootApplication

文章目录一、初识注解二、源码学习 一、初识注解 最近在哔哩哔哩上面看Java面试会经常看到:说一说你对@SpringBootApplication这个注解的理解? 接下来带大家一起学习了解一下这个注解 @SpringBootApplication是一个组合注解,用于快捷配置启动类。 @SpringBootApplication包含的三个注解及其含义: @Configuration: 用于定义一个配置类 @EnableAutoConfiguration :Spring Boot会自动根据你jar包的依

末尾卡片和博主交流学习! 3346

使用springboot开发项目第一天

我们用的IDEA开发项目,算是第一次使用springboot真正的在做公司项目,于是我就去更深入的学习看了公司源码,还有很多不懂,慢慢学吧,今天总结一下自己学习的心得吧 springboot其实就是整合其他第三方框架的一个框架主要用mvc注解和maven继承来实现,我对他们注解的源码很感兴趣,我要看一下 我写一下我对一些注解的理解 @SpringBootApplication 这个是SpringB...

weixin_43873781的博客 208

@SpringBootApplication注解介绍

@SpringBootApplication 在hello world中已经启动了一个最精简的springboot 应用.编写的代码来看,它与非spring boot应用区别有两个地方: (1)在QuickStartApplication类上添加了注解@SpringBootApplication; (2)是main方法调用SpringApplication.run(QuickStartAppli...

fenlin88l的博客 6778

spring中的@SpringBootApplication注解详解

@SpringBootApplication是Spring Boot框架的核心注解,通过组合@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan三个子注解,简化了Spring应用的配置和启动流程。其主要功能包括标记配置类、启用自动配置机制以及扫描并注册组件。自动配置机制通过spring.factories文件加载预定义的配置类,并根据条件注解(如@ConditionalOnClass)动态判断是否生效。开发者可以通过exclude属

技术人集结地 1744

@SpringBootApplication注解

是 Spring Boot 中最核心的注解之一,它是一个组合注解,用于简化 Spring Boot 应用的配置。通过使用这个注解,开发者可以快速启动一个 Spring Boot 应用,而无需编写大量的配置代码。下面我们来详细解析注解的作用和实现原理。

huing的博客 741

@SpringBootApplication注解分析

Spring Boot学习笔记(三):        通过前面内容介绍,我们发现 SpringBoot 项目需要在一个类上添加 @SpringBootApplication注解,然后执行该类下的 main() 方法,即可启动容器。接下来就从 @SpringBootApplication 注解来分析一下它的具体执行流程。 /** * @SpringBoot...

扛麻袋的少年的博客 2572

简明易理解的@SpringBootApplication注解源码解析(包含面试提问)

欢迎关注文章系列 ,关注我 《提升能力,涨薪可待》 《面试知识,工作可待》 《实战演练,拒绝996》 欢迎关注我博客,原创技术文章第一时间推出 也欢迎关注公 众 号【Ccww笔记】,同时推出 如果此文对你有帮助、喜欢的话,那就点个赞呗,点个关注呗! 《提升能力,涨薪可待篇》- @SpringBootApplication注解源码解析 一、@SpringBootApplication 的作用是什...

Ccww_的博客 9564
上一篇: show profiles的用法
下一篇: Mbatis-plus 源码学习笔记(一)
一个大泥球
博客等级 码龄9年 41粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值