@SpringBootApplication深入剖析

news2024/10/5 18:27:38

如下图 @SpringBootApplication是springboot项目启动类的注解,也是程序的入口,本文就是具体解析一下这个注解到底做了什么

在这里插入图片描述

一.@SpringBootApplication的构成

1.这个注解是一个组合注解,他是有三个注解合成的,对应图中的123步,而这三个注解中的@EnableAutoConfiguration注解又是一个复合注解,对应图中的2,3,但是其实@AutoConfigurationPackage只是一个壳子,主要是@Import起作用,接下来我们详细的了解一下各个注解的作用

在这里插入图片描述

二.各个注解的作用

1.@SpringBootConfiguration

1.这个注解只起了个新名称,本质上还是一个**@Configuration**
在这里插入图片描述

2.关于 @Configuration 我们已经很熟悉了,类似于XML定义的配置类,那么在这里的含义就是代表我们的Application类是一个配置类,当然也是IOC中的一个Bean,如下图可以证明,Application被加载,beanName为application
在这里插入图片描述

2.@ComponentScan

1.扫描指定路径(basePackages = “com.example”)所在的包以及子包下所有包含(@Component、@Controller、@Service、@Repository等注解)的类并注册到IOC容器中,那么具体能做啥,其实我们可以问问chat-gpt 哈哈哈
在这里插入图片描述

2.注意在这里,我们深入研究一下ComponentScan的剔除具体做了什么,避免囫囵吞枣

  1. type = FilterType.CUSTOM代表的是一个自定义过滤类型,
    意思就是:可以指定一个自定义的规则,根据规则决定是否作为bean放到容器中。其实就是实现一个TypeFilter接口的类中有个match方法,容器会把每个类当做参数传到这个方法中,返回true则剔除(因为我们这里用在excludeFilters,如果是includeFilters则不剔除)

  2. 而class是配置了两个过滤器类AutoConfigurationExcludeFilter和TypeExcludeFilter,如下图所示,我们进一步分析
    在这里插入图片描述

  3. AutoConfigurationExcludeFilter(翻译过来就是“自动配置过滤器”),先拿到了META-INF/spring.factories下配置的所有自动配置类,然后一一匹配我们的扫面的类,如果发现存在自动配置中则剔除,一句话总结,过滤项目中存在的自动装配的类,不加载到IOC容器中
    在这里插入图片描述

  4. TypeExcludeFilter则是先获取所有TypeExcludeFilter类型的的bean,(项目中是没有这个的,所以size是0),然后循环其中的每一个进行实现match匹配过滤,匹配到则返回true进行过滤。其关键作用在于:提供一种扩展机制,能让我们向IOC容器中注册一些自定义的组件过滤器,从而在包扫描的过程中过滤它们。

  5. 会从 BeanFactory 中获取所有类型为 TypeExcludeFilter 的组件,去执行自定义的过滤方法。

在这里插入图片描述

3.@EnableAutoConfiguration

这个注解也是一个符合注解,包括以下二个注解

1.@AutoConfigurationPackage

  1. 我们点开发现,其实还是一个@Import注解
    在这里插入图片描述

  2. @Import(AutoConfigurationPackages.Registrar.class)
    这个注解导入了一个内部类Registrar,实现了ImportBeanDefinitionRegistrar接口的registerBeanDefinitions方法,通过调试发现,AnnotationMetada为注解元信息数据,而@import通过@AutoConfigurationPackage间接注册到了主启动类上,导致解析注解得到的包名自然就是启动类所在的包,而register方法,则通过注册了该包及子包下的所有容器进入Spring中
    在这里插入图片描述
    3.总结:@AutoConfigurationPackage注解将主启动类所在包及其所有的子包批量注册进了Spring容器。

2.@Import(AutoConfigurationImportSelector.class)

  1. 其入口方法为selectImports,然后调用了本类的方法getAutoConfigurationEntry,再调用getCandidateConfigurations的loadFactoryNames加载所有在META-INF/spring.factories文件中的类全路径名
    在这里插入图片描述

在这里插入图片描述

  1. spring.factories文件的位置以及内容
    在这里插入图片描述
    我们点击,发现里面有非常多的xxxxAutoConfiguraion。也就是说,SpringBoot启动的时候,通过@Import(AutoConfigurationImportSelector.class)溯源到META-INF/spring.factories这样一个文件,加载了所有的自动装配配置类。
    但是呢,虽然这些组件全部被加载了,但是并没有全部生效,原因就在于@Conditional注解的条件装配,只有满足条件的配置类才会注入到IOC容器中并生效。

例如kafka的自动装配器,她的家在条件则是当存在KafkaTemplate这个bean的时候才会加载对应的kafka配置bean
在这里插入图片描述

  1. 总结来说就是@Import(AutoConfigurationImportSelector.class)通过加载META-INF/spring.factories,自动加载其中的配置类,又根据@Conditional的条件装配原理,选择性的将组件加载到容器中并生效。所以我们有时候只需要写入一些yml配置,或者引入某个bean,就可以把这个三方组件的其他配置全都设置好了,归根到底就是springboot提前写好了一些配置,等待你的激活

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/516163.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新的勒索软件加密自身以逃避防病毒

一种名为 Cactus 的新型勒索软件一直在利用 VPN 设备中的漏洞对“大型商业实体”的网络进行初始访问。 Cactus 勒索软件行动至少从 3 月开始就一直活跃,并正在寻求受害者的大笔支出。 虽然新的威胁参与者采用了勒索软件攻击中常见的策略——文件加密和数据窃取——…

大数据Doris(十七):Random Distribution和复合分区使用场景

文章目录 Random Distribution和复合分区使用场景 一、Random Distribution 二、复合分区使用场景 Random Distribution和复合分区使用场景 一、Random Distribution 如果 OLAP 表没有更新类型的字段,将表的数据分桶模式设置为 RANDOM,则可以避免严…

架构设计之需求分析

大家好,我是易安。 设计架构的第一步是需求分析。那么,为什么要做需求分析?如何做好需求分析?今天我们一起聊一聊需求分析这件事儿 为什么要做需求分析 为何要做需求分析? 首先,当然是因为我们做软件本身就…

迭代器失效问题,以及解决方法。

迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装,比如:vector的迭代器就是原生态指针T* 。因此迭代器失效,实际就是迭代器底层对应指针所指向的空间被销毁了&…

【小沐学Python】Python实现Web服务器(Flask+Vue+node.js,web单页增删改查)

文章目录 1、简介1.1 flask1.2 vue 2、开发2.1 新建flask项目2.2 安装flask库2.3 新建flask的主脚本2.4 新建Vue项目2.5 安装vue项目依赖项2.6 新增组件Ping.vue2.7 Ping.vue增加HTTP请求2.8 美化vue前端页面2.9 新增组件Books.vue2.10 flask增加路由Books2.11 Books.vue增加HT…

什么是ChatGPT?怎么用?

最近全网爆火的黑科技,叫做chatGPT。ChatGPT声称,它的AI对话模型能在大范围、细粒度问题上给出普遍准确的答案。简单地说,AI对话模型可以达到基本不犯错误的水平了。那么到底这个ChatGPT是什么?怎么用?本篇文章就来带大…

算法修炼之练气篇——练气二层

博主:命运之光 专栏:算法修炼之练气篇 题目 1084: 用筛法求之N内的素数 题目描述 用筛法求之N内的素数。 输入格式 N 输出格式 0~N的素数 样例输入 100 样例输出 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 …

学系统集成项目管理工程师(中项)系列21a_整体管理(上)

1. 含义 1.1. 包括为识别、定义、组合、统一和协调各项目管理过程组的各种过程和活动而开展的工作,是项目管理中一项综合性和全局性的管理工作 2. 项目经理是整合者 2.1. 【21上选33】 2.1.1. 【19上选37】 2.1.2. 【22上选33】 2.2. 通过与项目干系人主动、全…

shell脚本(磁盘空间、服务状态)

1、判断当前磁盘剩余空间是否有20G,如果小于20G,则将报警邮件发送给管理员,每天检查一次磁盘剩余空间。 第一步:创建脚本名为shell1.sh如下: vim shell1.sh 第二步:做计划在shell1文件中,命令…

Kyligence Zen 简直就是一站式指标平台的天花板

一、Kyligence Zen是什么? 1、Kyligence Zen是做啥的? Kyligence Zen是一款指标分析和管理的工具,是基于 Kyligence 核心 OLAP 能力打造,Kyligence Zen 提供集业务模型、指标管理、指标加工、数据服务于一体的一站式服务&#x…

孙溟㠭20余载春秋,4000多方印章,这双质朴的手有多么倔强的生命力

作品的背后往往折射出艺术家人生的广度和厚度。 先锋篆刻、书画艺术家孙溟㠭, 上世纪90年代开始接触篆刻, 至今,20载有余,积累了4000多方篆刻作品。 在他创作纪念吴品超院士的作品《药生尘》时, 我们拍到了艺术家…

高级Web题库

高级Web题库 For ZPT 声明 一切开发旨在学习,请勿用于非法用途 by rick rick 关注 永雏塔菲喵 永雏塔菲喵 选择题 第1题 知识点:CSS 题目:设置text-decoration属性的删除线的值为( )。 选项: A underlin…

固定翼无人机培训第二周总结——多轴和起降

博主学的III类固定翼垂直起降无人机,起降采用多旋翼(下图中红框就是旋翼),巡航采用固定翼。 理论大部分也是多旋翼,多轴旋翼无人机是指三个旋翼轴及以上的特殊直升机,多旋翼无人机靠旋翼速度和方向来控制无…

代码随想录算法训练营第三十八天 | 动态规划基础流程

动态规划理论基础 代码随想录 (programmercarl.com) 如果某一问题有很多重叠子问题,使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最…

Java结合POI框架实现Excel导入

Java结合POI框架实现Excel导入 一、流程概念二、conroller中的方法三、导入成功 一、流程概念 我们需要把excel通过上传得方式导入数据库,需要以下几个步骤 将excel上传到服务器指定文件夹内并重命名(upload)获取到文件公共路径和别名路径将…

InsCode再进步,AI 辅助编程帮你打开思路

文章目录 一、前言二、使用 AI 辅助完成代码1. 基于模板创建项目2. 使用 AI 辅助开拓思路3. 使用 AI 辅助生成代码4. 使用 AI 辅助优化代码 三、InsCode AI Chat 的使用建议四、总结 一、前言 你好,我是小雨青年,一名独立开发的程序员。 在之前的文章中…

Ubuntu22.04安装PyTorch1.13.0 GPU版本

目录 一、电脑相关信息 1. 电脑显卡环境: 二、安装Pytorch1.13.0/cu117(GPU版本) 1. 准备:新建虚拟环境 2. 用conda在线安装pytorch1.13.0/cu117(pytorch1.13.0 torchvision0.14.0 pytorch-cuda11.7)…

博客管理系统前端分析

目录结构博客列表页&#xff1a;所有页面共同的样式代码&#xff1a;博客详情页博客登录页博客编辑页 目录结构 博客列表页&#xff1a; 页面效果&#xff1a; 代码&#xff1a; <!-- 博客列表页 --> <!DOCTYPE html> <html lang"en"> <head…

计算机视觉的深度学习 Lecture4:Optimization 笔记 EECS 498.008

数值计算梯度 问题是慢&#xff0c;每个都要注意做步长&#xff0c;求除法。 应该用求导方法解决。 SGD通过每次抽取一部分&#xff08;mini-batch&#xff09;来计算梯度&#xff0c;而不是遍历整个数据集来求梯度&#xff0c;大大增大了求梯度速度&#xff0c;并且性能不…

TCP 协议特性详解

TCP 协议特性总结 TCP协议特点TCP协议段格式TCP原理确认应答&#xff08;安全机制&#xff09;超时重传&#xff08;安全机制&#xff09;连接管理&#xff08;安全机制&#xff09;(面试高频题)三次握手四次挥手 滑动窗口&#xff08;效率机制&#xff09;流量控制&#xff08…