SpringBoot——原理(自动配置+原理分析-源码跟踪)

源码跟踪

从Springboot的启动类进入,进行分析.

 源码跟踪技巧

在以后接触各种框架的时候,如果需要查看源码,需要找到关键点和核心流程,先在宏观对整个原理和流程有一个认识,之后再去了解其中的细节。

按住Ctrl+左键进入源码

在整个注解上面还有很多个注解,上面四个是用来修饰注解的元注解,不需要看。

下面开始第一个注解

@SpringBootConfigguration注解   

在这个注解中也有三个源注解,不用看。

除此之外的它的主要作用就是装配了@Configuration这个注解,作用就是声明配置类。

还有一个@Indexed注解作用是加速应用启动。 

有了这个注解后,启动类也会变成一个配置类,所以在启动类当中也可以像下面一样声明Bean对象交给IOC容器管理。 

 @ComponentScan

前面有说过启动类具有包扫描的功能,原因就是启动类已经配置了一个组件扫描的注解。

@EnableAutoConfiguration

在上一篇文章有提到@Enablexxxx这种注解一般里面封装的都是@Import开头的注解,用来导入指定的Bean或者配置类。从其后半段可以看出这个就是自动配置的核心注解。

从下面可以看见这个注解底层封装了一个Import注解,value是一个ImportSelector接口的实现类的全类名。

AutoConfigurationImportSelector

在这个实现类当中会看见它实现了一个嵌套了多层的ImportSelector接口。

在ImportSelector接口中会实现一个selectImports方法,返回一个Stinrg数组,里面就是需要导入到spring 的IOC容器中的类。

下面是对 selectImports方法的接口实现

 关于它具体怎么实现的真的不想再看了,以后面试前再来看吧,这个手撕源码的内容。

里面 selectImports会返回本类下的一个方法,里面有一个报错信息,

在上面这个信息中可以看出需要的东西有一个spring.factories和springframework.boot.autoconfigure

No auto configuration classes found in META-INF/spring.factories nor in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. 

 在前一篇 文章中模拟的第三方依赖中可以看见有以下这个autoconfigure这个依赖。这个就是进行自动配置的依赖,也就是上面需要的配置文件依赖。

又比如在用到mybatis的时候,在mybatis的依赖下也会有一个autoconfigure的依赖如下所示 

 在左侧栏目里面有一个外部库,有springboot官方提供的jar包,里面可以看这些依赖里面具体都是些什么样的信息。

往下找可以看见上面需要的两个东西。

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. 

//SpringBoot后期提供的加载配置类的文件

spring.factories      

//SprngBoot早期提供的加载配置类的文件

在 spring.factories 当中如下所示,里面都是一些类的全类名。

 在另外一个文件当中也是一些全类名,最终在项目启动时都会加载并读取到IOC容器当中交给IOC容器管理。这些类后缀都是AutoConfiguration,都是自动配置的意思。这些类底层都会封装一个

@Configure注解,关于功能的具体实现都是在底层有涉及

 比如下面这个Gson就是google提供的处理Json格式数据的依赖的底层具体实现。

 

 然后我们在导入这个依赖后就可以直接拿来注入使用了,但是不是所有的配置类下的Bean对象都会被注册到IOC容器当中,像上图这样还会有一个@ConditionalOnMissingBean注解表示按条件装配,只有满足一定条件之后才会被注册到IOC容器当中。

总结

下一篇文章再看@ConditionalOnMissingBean注解如何进行条件装配。

传送门链接:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么实现常用网络接口自动化测试框架应用?

一、RESTful(resource representational state transfer)类型接口测试 (一)GUI界面测试工具:jmeter 1、添加线程组 2、添加http请求 3、为线程组添加察看结果树 4、写入接口参数并运行 5、在查看结果树窗口查看结果 6、多组数据可增加CSVDat…

基于物理信息的神经网络(Physics-informed Neural Networks;PINNs)Part-1(简单介绍)

【摘要】 基于物理信息的神经网络(Physics-informed Neural Networks,简称PINNs),是一类用于解决有监督学习任务的神经网络,它不仅能够像传统神经网络一样学习到训练数据样本的分布规律,而且能够学习到数学…

UFS 2 -UFS架构简介2

UFS 2 -UFS架构简介2 1 UFS架构简介1.1 System Boot and Enumeration1.2 UFS Interconnect (UIC) Layer1.2.1 UFS Physical Layer Signals1.2.2 MIPI UniPro1.2.3 MIPI UniPro Related Attributes 1.3 UFS Transport Protocol (UTP) Layer1.3.1 Architectural Model1.3.1.1 Cli…

图解max{X,Y}和min{X,Y}并求相关概率

图解max{X,Y}和min{X,Y}并求相关概率 对max{X,Y}或min{X,Y}进行分解再求解 P ( m a x { X , Y } ≥ c ) P [ ( X ≥ c ) ∪ ( Y ≥ c ) ] P ( m a x { X , Y } ≤ c ) P [ ( X ≤ c ) ∩ ( Y ≤ c ) ] P ( m i n { X , Y } ≥ c ) P [ ( X ≥ c ) ∩ ( Y ≥ c ) ] P ( m i…

k8s功能优势应用场景介绍(一)

一,K8S功能: 1、数据卷 pod中容器之间共享数据,可以使用数据卷 2、应用程序健康检查 容器内服务可能进程阻塞无法处理请求,可以设置监控检查策略保证应用健壮性 3、复制应用程序实例 控制器维护着pod副本数量,保证一个pod或一组同…

C++11 auto类型推导

1.类型推导 C11引入了auto 和 decltype 关键字实现类型推导,通过这两个关键字不仅能方便地获取复杂的类型,而且还能简化书写,提高编码效率。 auto 类型推导的语法和规则 在之前的 C 版本中,auto 关键字用来指明变量的存储类型…

Allure测试报告定制全攻略,优化你的Web自动化测试框架!

目录 前言: 1. Allure测试报告简介 2. Web自动化测试框架简介 3. 封装Web自动化框架 3.1 安装Selenium 3.2 封装Selenium 3.3 定制Allure测试报告 3.3.1 适配翻译插件 3.3.2 定制测试报告样式 4. 示例代码 5. 总结 前言: 随着现在Web应用的普…

SciencePub学术 | 计算机科学类重点SCIEI征稿中

SciencePub学术刊源推荐: 计算机科学类SCI&EI征稿中!录用率高,自引率低,进展顺利。信息如下,录满为止: 一、期刊概况: 【期刊简介】IF:4.0-4.5↑, JCR 2区,中科院3区…

SpringAOP简介及实现(包含切面、切点、连接点和通知)

目录 1.什么是AOP、SpringAOP? 2.AOP的组成 3.SpringAOP的实现 4.切点的表达式 1.什么是AOP、SpringAOP? 在学习SpringAOP之前,我们得先了解一下什么是AOP。AOP是一种面向切面编程的思想。那什么是切面呢?它其实是对某一类事情…

【HR专用】Vue+SpringBoot,实现人才招聘库的开发(后端部分)

人才招聘库是企业用于储存和管理潜在候选人信息的数据库。通常情况下,这些候选人可能已经应聘过公司的职位,也可能是通过其他途径获取的,例如社交网络、招聘网站等。 对于一个中小公司来说,人力资源部绝对是一个重要部门&#xff…

测试类型(单元、集成、系统或手动测试)

测试类型(单元、集成、系统或手动测试) 单元测试 单元是系统的单个组件,例如类或单个方法。孤立地测试单元称为单元测试。 优点:速度快/易控/易写 缺点:缺乏现实性/无法捕获所有错误(例如与其他组件或服务的交互) 单元…

Arthas-JVM相关命令使用

tip:作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。 开头: 我们先说下生产使用频率较高的有哪些:dashboard、heapdump、jvm…

【连续介质力学】二阶张量的图像表示

二阶张量在特定方向的投影 法向和切向分量 二阶张量T投影到 n ^ \hat n n^方向的结果是 t ⃗ ( n ^ ) T ⋅ n ^ \vec t^{(\hat n)}T \cdot \hat n t (n^)T⋅n^,其中 t ⃗ ( n ^ ) \vec t^{(\hat n)} t (n^)可以分解成: t ⃗ ( n ^ ) T ⃗ N T ⃗ S…

2023年上半年系统规划与管理师上午真题及答案解析

1.香农用概率来定量描述信息的公式如下,其中H(x)表示X的( ),Pi是( )出现第i种状态的( )。 A.信息熵 事件 概率 B.总熵 单位 概率 C.信息熵 单位 概率 D.总熵 单位 度量 2.信息传输模型中,( )负责信息的向外传播,( )负责…

VSLAM视觉里程计总结

相机模型是理解视觉里程计之前的基础。视觉里程计(VIO)主要分为特征法和直接法。如果说特征点法关注的是像素的位置差,那么,直接法关注的则是像素的颜色差。特征点法通常会把图像抽象成特征点的集合,然后去缩小特征点之…

Android 应用快捷ShortcutManager与ShortcutManagerCompat详解与实战(二)

一、介绍 之前我已通过一篇文章介绍了应用快捷的接入与Demo。如果还未看过上一篇的文章可以先了解入门。 传送门:Android 应用快捷(shortcut)功能的详解(一)_蜗牛、Z的博客-CSDN博客 有创建自然就会有管理,否则一个完美的方案不应该这么被推荐出来。如何…

Zemax Lumerical | 二维光栅出瞳扩展系统优化(下)

简介 本文提出并演示了一种以二维光栅耦出的光瞳扩展(EPE)系统优化和公差分析的仿真方法。 在这个工作流程中,我们将使用3个软件进行不同的工作 ,以实现优化系统的大目标。首先,我们使用 Lumerical 构建光栅模型并使用…

数据库实验报告--安全性实验

一、 实验目的 (1)理解SQL Server验证用户身份的过程,掌握设置身份验证模式的方法。 (2)理解登录账号的概念,掌握混合认证模式下登录账号的建立与取消方法。 (3)掌握混合认证模式…

Centos7中mysql安装配置

前提:先关闭防火墙或开启tcp的3306端口 1、查看服务器上是否有现成的安装包 yum list mysql* 2、去mysql官网的yum资源库找到对应的rpm文件的下载链接 确定系统版本 cat /etc/redhat-release 到mysql官网复制对应版本的资源下载链接 MySQL :: Download MySQL Yum…

git Husky

虽然我们已经要求项目使用eslint了,但是不能保证组员提交代码之前都将eslint中的问题解决掉了: 也就是我们希望保证代码仓库中的代码都是符合eslint规范的; 那么我们需要在组员执行 git commit 命令的时候对其进行校验,如果不符合…