springboot原理篇-springboot

news2024/11/25 16:50:38

springboot原理篇-springboot(三)

一、起步依赖

虽然我是直接学习springboot的,没有经历过使用spring开发,但是鉴于我还学习了c++,对依赖这方面真的一言难尽!springboot起步依赖解决依赖问题我实在是羡慕!

直接讲重点:起步依赖的原理就是Maven的依赖传递。

二、自动配置

总所周知,默认情况下,SpringBoot项目在启动的时候会自动的创建IOC容器(也称为Spring容器),并且在启动的过程当中会自动的将bean对象都创建好,存放在IOC容器当中。但我们并不了解这是什么时候添加进去的,如何添加进去的。可能你们会想着,我直接就行了,需要了解原理干什么?这里我只能说,速成能让你快速上手一个项目,但真正觉得能否走远的只会是基础,例如,通过了解这个原理,对后面自己配置依赖有很大帮助,同时让我们在遇到错误时知道错误产生的原因,因此,了解原理还有一个重要原因那就是能提高我们解决问题的能力,如果你连错误产生的原因都不知道,那么解决问题的方法就更无从谈起。

1、概述

​ SpringBoot的自动配置就是当Spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作,以下就是springboot项目在启动时自动添加的bean对象

在这里插入图片描述

前面我们通过学习bean管理可以知道,在我们使用第三方库的时候,是需要导入配置文件的,这些配置文件中定义了我们需要添加的bean对象,如果没有这个配置文件,而仅仅是在pom文件中添加坐标是不行的,那么我们如何导入这个配置文件呢?springboot提供了如下方法

  • 导入 ImportSelector 接口实现类,@Import 通过实现其中的public String[] selectImports函数,获取我们需要添加的所以bean的全类名!这样我们就能知道我们要添加哪些bean了
@Import({TokenParser.class, HeaderConfig.class})
@SpringBootApplication
public class SpringbootWebConfig2Application {
}

但是,通过上述我们发现,如果添加的第三方依赖很多,使用@Import就显得很麻烦,总不能一个一个写吧,于是,springboot有添加了一个新的注释:EnableXxxx注释,里面封装了@Import注释,我们通过追踪启动类的SpringBootApplication注释就能够发现该注释EnableAutoConfiguration

在这里插入图片描述

  • 我们先来看第一个注解:@SpringBootConfiguration

在这里插入图片描述

通过这里,我们就能知道为什么能改启动类中定义第三方bean了,应为启动类就是一个配置类!!!

  • 接下来再先看@ComponentScan注解:

在这里插入图片描述

@ComponentScan注解是用来进行组件扫描的,扫描启动类所在的包及其子包下所有被@Component及其衍生注解声明的类。

SpringBoot启动类,之所以具备扫描包功能,就是因为包含了@ComponentScan注解。

所以通过这里我们就能发现,为什么我们在pom文件中只添加坐标不行,那是因为springboot项目只会扫描启动类所在的包及其子包下所有被@Component及其衍生注解声明的类!

  • 最后我们来看看@EnableAutoConfiguration注解(自动配置核心注解):

在这里插入图片描述

这里我们就能发现,@EnableAutoConfiguration注解里面封装了@Import注解,导入了实现ImportSelector接口的实现类,这样我们就能导入配置类了,通过@EnableAutoConfiguration@ComponentScan两个注解的配合,我们就能添加我们在pom中添加的所有依赖的bean对象!但是我们不知道配置文件在哪里,我们继续跟踪源码

  1. 进入AutoConfigurationImportSelector

在这里插入图片描述

  1. 我们发现AutoConfigurationImportSelector里面实现了selectImports函数,这不正是我们需要的吗!进入getAutoConfigurationEntry

在这里插入图片描述

  1. 进入getCandidateConfigurations

在这里插入图片描述

  1. 成功找到配置文件

在这里插入图片描述

“No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.”,这里的META-INF/spring.factories就是一个配置文件,但是呢,在高版本的springboot框架中,还使用了如下META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,

getCandidateConfigurations方法的功能:

获取所有基于META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件、META-INF/spring.factories文件中配置类的集合

在这里插入图片描述

其中,META-INF/spring.factories貌似在高版本中已经不用了

那么,META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件和META-INF/spring.factories文件这两个文件在哪里呢?

在这里插入图片描述

所有我们就知道在安装依赖的时候,这些配置文件人家已经帮我们弄好了,这样在项目启动的时候,这些配置文件就会被加载,讲对应的bean添加到IOC容器中

在这里插入图片描述

例如,我们查看第三方依赖中提供的GsonAutoConfiguration类:

在这里插入图片描述

在GsonAutoConfiguration类上,添加了注解@AutoConfiguration,通过查看源码,可以明确:GsonAutoConfiguration类是一个配置。

在这里插入图片描述

看到这里,大家就应该明白为什么可以完成自动配置了,原理就是在配置类中定义一个@Bean标识的方法,而Spring会自动调用配置类中使用@Bean标识的方法,并把方法的返回值注册到IOC容器中。

自动配置源码小结

自动配置原理源码入口就是@SpringBootApplication注解,在这个注解中封装了3个注解,分别是:

  • @SpringBootConfiguration
    • 声明当前类是一个配置类
  • @ComponentScan
    • 进行组件扫描(SpringBoot中默认扫描的是启动类所在的当前包及其子包)
  • @EnableAutoConfiguration
    • 封装了@Import注解(Import注解中指定了一个ImportSelector接口的实现类)
      • 在实现类重写的selectImports()方法,读取当前项目下所有依赖jar包中META-INF/spring.factories、META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports两个文件里面定义的配置类(配置类中定义了@Bean注解标识的方法)。

当SpringBoot程序启动时,就会加载配置文件当中所定义的配置类,并将这些配置类信息(类的全限定名)封装到String类型的数组中,最终通过@Import注解将这些配置类全部加载到Spring的IOC容器中,交给IOC容器管理。

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

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

相关文章

移动端超超超详细知识点总结(Part4)

rem基础 1. rem单位 rem (root em)是一个相对单位,类似于em,em是父元素字体大小。不同的是rem的基准是相对于html元素的字体大小。比如,根元素(html)设置font-size12px; 非根元素设置width:2rem;则换成px表示就是24p…

条件语句与循环结构

引言 条件语句和循环结构是C语言中构建程序逻辑的基本工具。它们允许程序根据条件执行不同的代码块和重复执行某些操作。本篇文章将详细介绍C语言中的条件语句和循环结构,包括if、else、switch语句,以及for、while、do-while循环的使用,帮助读…

【猫狗分类】Pytorch VGG16 实现猫狗分类1-数据清洗+制作标签文件

Pytorch 猫狗分类 用Pytorch框架,实现分类问题,好像是学习了一些基础知识后的一个小项目阶段,通过这个分类问题,可以知道整个pytorch的工作流程是什么,会了一个分类,那就可以解决其他的分类问题&#xff0…

JWT令牌、过滤器Filter、拦截器Interceptor

目录 JWT令牌 简介 JWT生成 解析JWT 登陆后下发令牌 过滤器(Filter) Filter快速入门 Filter拦截路径 过滤器链 登录校验Filter-流程 拦截器(Interceptor) Interceptor 快速入门 拦截路径 登录校验流程 JWT令牌 简介 全称:JSON Web Token(https://iwt.io/) …

可信计算和数字水印技术

可信计算 可信计算可信计算基础概述可信计算关键技术要素可信性认证可信计算优劣 数字水印技术数字版权保护技术 可信计算 可信计算基础概述 可信计算(Trusted Computing,TC):在计算和网络通信系统中广泛使用的、基于硬件安全模块…

驱动开发(五):Linux内核定时器

驱动开发系列文章: 驱动开发(一):驱动代码的基本框架 驱动开发(二):创建字符设备驱动 驱动开发(三):内核层控制硬件层 驱动开发(四&#xff…

LabVIEW盾构机状态监测

随着城市化的加速,地铁成为了城市交通的重要组成部分。为了保障地铁施工安全和效率,提出了一种基于LabVIEW的地铁施工盾构异常状态监测方法。该方法利用LabVIEW软件进行数据采集和处理,通过异常监测技术实时监控盾构机的运行状态,…

【纯干货级教程】深度学习根据loss曲线进行分析调参

相信很多刚刚接触目标检测系列算法小伙伴跑深度学习算法时会有许多困惑,比如训练得出的loss曲线有什么意义?训练的一些参数要如何设置选择?选择哪个算法模型作为baseline、选择哪个参数量/复杂度/深度的模型进行训练最为合适? 本…

Apache IoTDB进行IoT相关开发实践

当今社会,物联网技术的发展带来了许多繁琐的挑战,尤其是在数据库管理系统领域,比如实时整合海量数据、处理流中的事件以及处理数据的安全性。例如,应用于智能城市的基于物联网的交通传感器可以实时生成大量的交通数据。据估计&…

15. 第十五章 类和对象

15. 类和对象 到现在你已经知道如何使用函数组织代码, 以及如何使用内置类型来组织数据. 下一步将学习面向对象编程, 面向对象编程使用自定义的类型同时组织代码和数据. 面向对象编程是一个很大的话题, 需要好几章来讨论.本章的代码示例可以从↓下载, https://github.com/Alle…

Linux 并发与竞争实验学习

Linux 并发与竞争实验学习 原子操作实验 这里原子操作就是采用原子变量来保护一个程序运行的完整过程,使用atomic 来实现一次只能允许一个应用访问 LED,创建atomic.c文件,其实改动内容就是添加原子变量, 要在设备结构体数据添加…

MEMS:Lecture 19 Wafer bonding package

讲义 Current MEMS Packages Die Level (芯片级) 封装 图片描述:左侧的图显示了Cronos继电器的芯片级封装。这种封装方式是在晶圆切割后,将独立的MEMS芯片组装到单独的陶瓷封装中。特点: Die level release and ceramic package&#xff1a…

数据库管理-第204期 数据库的IO掉速,也许是SSD的锅(20240615)

数据库管理204期 2024-06-15 数据库管理-第204期 数据库的IO掉速,也许是SSD的锅(20240615)1 SSD物理结构2 SSD颗粒类型3 DRAM & SLC Cache3.1 DRAM3.2 SLC Cache3.3 其他方式 4 缓外降速总结 数据库管理-第204期 数据库的IO掉速&#xff…

C++ Windows下Glog日志库安装使用教程

🙋 介绍:glog是google推出的一款轻量级c++开源日志框架。  环境配置:windows+VS2015+gflags 2.2.2+glog-0.3.5。为避免新版本(glog V0.7.1)踏坑,建议装低版本,这里我选用的是V0.3.5。 1. 下载 在gflags官方中下载gflags代码,官方地址 在Glog官方中下载,githut地址:…

探索开源世界:2024年值得关注的热门开源项目推荐

文章目录 每日一句正能量前言GitCode成立背景如何使用GitCode如何把你现有的项目迁移至 GitCode?热门开源项目推荐actions-poetry - 管理 Python 依赖项的 GitLab CI/CD 工具项目概述技术分析应用场景特点项目地址 Spider - 网络爬虫框架项目简介技术分析应用场景项…

【Mac】Luminar Neo for mac(图像编辑软件)软件介绍及同类型软件比较

Luminar Neo软件介绍 Luminar Neo 是一款由 Skylum 开发的功能强大的照片编辑软件,专为摄影师和摄影爱好者设计。它适用于 Mac 和 Windows 平台,提供了一系列先进的编辑工具和功能,使用户能够轻松提升和优化他们的照片。以下是 Luminar Neo …

C#开发-集合使用和技巧(四)集合中常用的查询方法

集合中常用的查询方法 测试数据准备:查询方法详解**Where**条件查询定义和注释:功能详细说明:应用实例查找所有设备类型为“生产设备”的对象 结果测试:查询所有测试结果大于90的设备多条件查询:类型为生产设备同时测试…

2023年的Top20 AI应用在近一年表现怎么样?

AI应用现在进入寒武纪大爆发时代,百花争艳。如果倒回到2023年初,那时候排名靠前的AI应用在一年多时间,发生了哪些变化?能带给我们什么启示? 在2023年1月,排名靠前20的AI应用是: DeepL&#xff…

datax图形化界面datax-web安装及使用

环境准备:需要先安装git和maven git安装可参考git的安装-CSDN博客 maven只需解压安装包,配置环境变量即可使用 1 源代码下载 直接从Git上面获得datax-web源代码 git clone https://gitee.com/WeiYe-Jing/datax-web.git 2 打包项目 进入项目源码根…

Spring底层架构核心概念解析

BeanDefinition BeanDefinition表示Bean定义,BeanDefinition中存在很多属性用来描述一个Bean的特点.比如: beanClass:表示Bean类型scope:表示Bean作用域,单例/原型等lazyInit:表示Bean是否懒加载initMethodName:表示Bean初始化时要执行的方法destoryMethodName:表示Bean销毁时…