springboot原理篇-springboot

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.mzph.cn/pingmian/28126.shtml

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

相关文章

第 18章 安全架构设计理论与实践

安全架构是架构面向安全性方向上的一种细分,可关注三个安全方面,即产品安全架构、安全技术体系架构和审计架构,这三个方面可组成三道安全防线。本章主要分析安全威胁、介绍安全模型,在此基础上,就系统、信息、网络和数…

从0开始理解DevOps

目录 一、DevOps背景 二、DevOps介绍 DevOps 组成 三、Jenkins Jenkins 工作流程 四、云原生与DevOps 相信你一定听过 DevOps 这个词,那它到底是什么呢?为什么越来越多的互联网企业都在追随使用它?它与云原生有什么关系?本文将…

VRChat 2024年裁员原因与背景深度分析

VRChat,作为2022年元宇宙/VR社交领域的巨头,近期在2024年宣布裁员计划,其背后原因和背景值得业界尤其是仍在纯元宇宙虚拟空间创业的同仁们重点关注。 一、创始人决策失误 根据CEO的邮件披露,VRChat的创始人因缺乏经验和过度自信…

Java 桥接模式(Bridge Pattern)是设计模式中的一种结构型设计模式,桥接模式的核心思想是将抽象与实现解耦

桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与它的实现部分分离,使它们都可以独立地变化。桥接模式的核心思想是将抽象与实现解耦,使得它们可以独立扩展。 在桥接模式中,通常包含以下四个…

MySQL之优化服务器设置(四)

优化服务器设置 InnoDB的IO配置 双写缓冲(Doublewrite Buffer) InnoDB用双写缓冲来避免页没写完整所导致的数据损坏。当一个磁盘写操作不能完整地完成时,不完整的页写入就可能发生,16KB的页可能只有一部分被写到磁盘上。有多种多样的原因(崩溃、Bug&am…

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

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

生成和链接动态库

生成和链接动态库 在Linux和windows中的动态库是不一样的 linux 的动态库不需要设置导入导出符号,以.os为后缀windows中需要设置导入和导出符号.lib,以及动态库的后缀是dll 1、windows环境 1、创建动态库 项目结构 CMakeLists.txt cmake_minimum_re…

使用Ventoy 替代Win_To_Go更好的随身系统

Ventoy支持在物理机上直接启动安装了 Linux/Windows 系统的 磁盘映像文件 。 系统是在真实物理机上运行,并不是在虚拟机里运行,没有性能损失。支持 Legacy BIOS 和 UEFI 模式。支持从任意磁盘启动磁盘映像。 Windows 支持固定大小以及动态扩展类型的 VH…

设计模式-代理模式Proxy(结构型)

代理模式(Proxy) 代理模式是一种结构型模式,它可以通过一个类代理另一个类的功能。代理类持有被代理类的引用地址,负责将请求转发给代理类,并且可以在转发前后做一些处理 图解 角色 抽象主题(Subject&…

光功率计传感器

光探测仪表: 激光功率计探头按照不同的原理和材料分为热电堆型、光电二极管型以及包含两种传感器的综合探头, 激光能量计则有热释电传感器和热电堆传感器探头 热释电效应传感器: 热释电传感器的工作原理主要是基于热释电效应。当物体处于不同温度时,会发射出不同强度的红…

深入剖析 Laravel 框架:构建高效PHP应用的最佳实践

引言 随着互联网的高速发展,PHP 作为一门广泛使用的服务器端脚本语言,始终备受开发者青睐。而在众多 PHP 框架中,Laravel 凭借其优雅的设计和高效率,成为了构建现代 Web 应用的热门选择。本文将从零开始,探讨如何使用 …

镍电解阳极液深度除铜树脂

摘要&#xff1a;HP686适用于以下行业中的铜、镍等金属选择性吸附&#xff1a; • 可用于锂电正极材料、锂电回收等生产过程中回收镍、铜&#xff0c;料液纯化 • 可在酸性条件下 (pH< 2) &#xff0c;吸附铜离子 • 钴电解液中去除镍离子&#xff0c;纯化电解液 • 可在…

面向对象前置(java)

文章目录 环境配置相关如何在 cmd 任何路径下中 使用 javac(编译) 和 java(运行) 指令path变量的含义javac(编译&#xff09;使用java(运行&#xff09;的使用public class 和 class 的区别 标识符命名规则命名规范 字面量字符串拼接变量的作用域转移字符类型转换接收用户键盘输…

公差基础-配合(互换性和测量基础)-2

过盈配合&#xff1a; 配合的种类&#xff1a; 三种&#xff1a;间隙&#xff0c;过渡&#xff0c;过盈配合&#xff1a; 间隙配合&#xff1a; 过盈配合&#xff1a; 过渡配合&#xff1a; 间隙量&#xff1a;最大间隙减去最小间隙&#xff1b; 配合的公差怎么算&#xff1a…

江协科技STM32学习- 2安装Keil5-MDK

本文是根据哔哩哔哩网站上“江协科技STM32”视频的学习笔记&#xff0c;在这里会记录下江协科技STM32开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技STM32教学视频和链接中的内容。 引用&#xff1a; STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩…

TypeScript入门教程

今天&#xff0c;给大家分享一个自己总结的超详细的TypeScript入门教程电子书。从TypeScript的基础知识开始讲解&#xff0c;包括数据类型、变量、运算符、条件语句、循环结构等基本概念。接着&#xff0c;详细介绍TypeScript中的函数、类和接口等高级特性&#xff0c;以及如何…

Oracle阅读Java帮助文档

进入到Help Center 选择Java 查看Java SE [version]对应版本相关的内容 查看其它版本 查看Java11 javac等相关参数 目录查看java相关命令

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

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

篮球杯小白+强者

2. 宣读数字【算法赛】 思维题&#xff0c;注意到完全平方数的约数是奇数个&#xff0c;其余都是偶数个。 #include <bits/stdc.h>using namespace std;#define LL long long#define pb push_back#define x first#define y second #define int long long #define endl \n…

在机器学习领域中,One-Hot Encoding是什么

一般来说&#xff0c;机器学习模型要求所有的输入输出变量都必须是数字。如果我们的数据中包含了分类数据&#xff0c;我们必须将它们编码成一些数字&#xff0c;这样我们才可以拿去训练和评测一个机器学习模型。 我们常说的分类数据是不能够直接拿来训练、预测的。因为它们一…