springboot starter工作原理_98,谈谈SpringBoot的工作原理

对技术的探索,一切源于好奇心,保持好奇心,才能让人更年轻。

至今,我们已经有了很多创建SpringBoot项目的经验,比如我们要创建一个支持web开发的项目,我们只需要引入web-starter模块即可。

那么,SpringBoot为什么这么神奇?引入的依赖变少了,配置文件也不见了,但项目却可以正常运行。下面我们一起来探究这背后的逻辑:

1,为什么依赖的依赖变少了?SpringBoot是如何管理这些依赖的?

我们分两个点来看起

1.1 从pom文件出发

首先,是有一个父工程的引用

dc7a4c04966009d038db0b773b4116e8.png

我们继续往里面跟踪,发现父工程又依赖于另一个父工程

1869bf434081cb73c8cc0df6cb3bd452.png

继续跟踪,发现这是一个pom工程,统一控制版本

19a4cf3261e93ababdaf37b1c09fc232.png

定义了一堆第三方jar包的版本

a164b489dce1e2aa7ee2c9ca8c8a99f2.png

结论:

所有我们使用了SpringBoot之后,由于父工程有对版本的统一控制,所以大部分第三方包,我们无需关注版本,个别没有纳入SpringBoot管理的,才需要设置版本号

1.2 SpringBoot将所有的常见开发功能,分成了一个个场景启动器(starter),这样我们需要开发什么功能,就导入什么场景启动器依赖即可。

比如,我们现在要开发web项目,所以我们导入了spring-boot-starter-web

2072db31fa670218dbf14bb72ddf0d74.png

我们来跟踪看看,内部也复用一些starter

7f7a213903b74cd1b1b7c16f6d67c599.png

还有Springweb和SpringMVC,这也就是为什么,我们就可以开发SpringWeb程序的原因

562b32accb47db7858004a09a3adbeca.png

结论:

  • 大家会发现,SpringBoot是通过定义各种各样的Starter来管理这些依赖的
  • 比如,我们需要开发web的功能,那么引入spring-boot-starter-web
  • 比如,我们需要开发模板页的功能,那么引入spring-boot-starter-thymeleaf
  • 我们需要整合redis,那么引入spring-boot-starter-data-redis
  • 我们需要整合amqp,实现异步消息通信机制,那么引入spring-boot-starter-amqp
  • 等等,就是这么方便

2,为什么我们不需要配置?

我们来看看SpringBoot的启动类代码,除了一个关键的注解,其他都是普通的类和main方法定义

313e13815935cfb9833f1068efe05982.png

那么,我们来观察下这个注解背后的东西,发现,这个注解是一个复合注解,包含了很多的信息

4d138b0af9f911b8e08f35a869e03e3a.png

其他注解都是一个注解的常规配置,所以关键看圈中的这两个

我们来分析第一个关键注解:@SpringBootConfiguration

我们可以看到,内部是包含了@Configuration,这是Spring定义配置类的注解

而@Configuration实际上就是一个@Component,表示一个受Spring管理的组件

14186825570e5f0db913dce7f92d525e.png

结论:@SpringBootConfiguration这个注解只是更好区分这是SpringBoot的配置注解,本质还是用了Spring提供的@Configuration注解

我们再来探讨下一个注解:@EnableAutoConfiguration

这个注解的作用是告诉SpringBoot开启自动配置功能,这样就减少了我们的配置

那么具体是怎么实现自动配置的?

我们先来观察这个注解背后的内容

f7575fee806805f5ff541ac7add3227f.png

所以,又到了分析圈中的两个注解了

先来分析@AutoConfigurationPackage

观察其内部实现,内部是采用了@Import,来给容器导入一个Registrar组件

4b070c475a9c16e9af33e1169758026e.png

所以,我们继续往下跟踪,来看Registrar内部是什么情况?

73f95ec8b9df87a807e5bc32dd6fb66f.png

我们可以跟踪源码看看这段是什么信息

0fa585013df748492099202af945d1aa.png

结论:

通过源码跟踪,我们知道,程序运行到这里,会去加载启动类所在包下面的所有类

这就是为什么,默认情况下,我们要求定义的类,比如controller,service必须在启动类的同级目录或子级目录的原因

再来分析@Import(AutoConfigurationImportSelector.class)

这个的关键是来看AutoConfigurationImportSelector.class内部的细节

在这个类的内部,有一个关键的方法,我们可以调试来看看结果

550183db3e483b47a5e3331b1ce635f6.png

发现默认加载了好多的自动配置类,这些自动配置类,会自动给我们加载每个场景所需的所有组件,并配置好这些组件,这样就省去了很多的配置

07ea06fd2556e805f4aec11dccf29265.png

好了,今天就写到这,祝大家周末愉快,每天都能增值一点点!

有更多的时间去做自己喜欢的事。

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

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

相关文章

精英主义 遗传算法 matlab,遗传算法优化 - osc_lfs4vsih的个人空间 - OSCHINA - 中文开源技术交流社区...

1.遗传算法简介遗传算法是一种基于自然选择和群体遗传机理的搜索算法,它模拟了自然选择和自然遗传过程中的繁殖、杂交和突变现象.再利用遗传算法求解问题时,问题的每一个可能解都被编码成一个“染色体”,即个体,若干个个体构成了群体(所有可能解).在遗传算法开始时,总是随机的产…

php后台管理员登录密码错误,如果后台管理员的密码错误,我该怎么办,还有两种找回密码的方法...

Dedecms是中国著名的网站管理核心. 由于编织梦想简单易用,因此可以进行二次开发,并且可以实现各种网站. 在使用dedecms的过程中,如果忘记了梦想管理后台的密码怎么办?神山个人博客分享了两种修改(重置)管理员密码的方法.1. 下载织…

mac安装多php环境变量配置,Mac如何安装多个php版本

Mac安装多个php版本的方法:首先打开Mac上的终端工具,并确认安装Homebrew;然后安装【php5.5】及对应扩展;最后执行指令【brew unlink php55】删除brew中php的软链即可。Mac安装多个php版本的方法:1、打开Mac上的终端工具…

phpexcel 获取工作簿名称_工作分享 | Excel快速汇总考勤

点击蓝字关注我们每月月底,各位同事把考勤表报到部门后,检查核对再汇总一份总考勤表上报,传统的复制粘贴总是占用不少时间,还容易出错。为提高工作效率,现利用Excel实现考勤快速汇总。01 统一考勤模板,每个…

php进程通讯方式,PHP进程模型、进程通讯方式、进程线程的区别分别有哪些?

PHP进程模型是一个正在执行的程序,可以分配给处理器并由处理器执行的一个实体;PHP进程通讯方式有管道及有名管道,信号,共享内存等;PHP进程线程的区别有进程是资源的分配和调度的一个独立单元,而线程是CPU调…

iphone怎样关闭副屏_小米新设计专利曝光:“Z”型折叠屏手机

折叠屏手机可以说是最近几年的热门话题,虽然并未大面积普及,但已有多家厂商量产上市了旗下的折叠屏手机。同样作为知名厂商的小米,曾在此前展示过旗下的折叠屏手机视频,但并未真正发布。而近日曝光的一份小米旗下专利设计则表明小…

php socket开发斗地主,基于状态机模型的斗地主游戏(NodeJsSocketIO)

1. 系统结构系统考虑使用Nodejs和SocketIo实现服务器端逻辑,前端使用HTML5。2. 逻辑流程1 . 主要逻辑包括用户进入游戏、等待对家进入游戏、游戏过程、结束统计这4个过程。2 . 游戏过程的逻辑具体如下3 . 服务器-客户端通讯逻辑如下3. 客户端界面设计1 . 登录界面2 …

wgs84转经纬度_wgs84经纬度转为cgcs2000平面坐标

航拍测绘中,pos数据多数是wgs84,而GCP坐标是2000或者80坐标。有如下2情况需要转换坐标,1.不同坐标系刺点时,位置相差较远,影响工作效率。2.该软件不支持wgs84转国家2000,比如photoscan。所以需要把pos数据转为跟像控点…

oracle sql last_value,図でイメージするOracle DatabaseのSQL全集 第3回 分析関数

指定したソートキーでの、最初の行の値を求めるのが、First_Value関数。指定したソートキーでの、最後の行の値を求めるのが、Last_Value関数。指定したソートキーでの、(Row_Numberな順位が)n番目の行の値を求めるのが、nth_Value関数となります。Oracle11gR2でnth_Value関数が…

企业信息化投入中咨询服务_全过程工程咨询服务核心价值是什么

建筑行业服务现状传统建设工程的目标、计划、控制都以参与单位个体为主要对象,项目管理的阶段性和局部性割裂了项目的内在联系,导致项目管理存在明显的管理弊端,这种模式已经与国际主流的建设管理模式脱轨。“专而不全”、“多小散”企业的参…

交流信号叠加直流偏置_放大器偏置电流Ib需要完整的直流回路

多数工程师对于放大器偏置电流参数并不陌生,它是导致放大器电路产生直流噪声的又一重要影响因素。因为偏置电流经过输入端电阻网络会形成一个失调电压源,再通过电路的噪声增益影响输出直流噪声。所以工程师会注重电阻网络的匹配,降低偏置电流…

teamviewer类似软件_TeamViewer系统后台被黑客组织APT攻破,请注意防范

TeamViewer事件10月11日,深圳市网络与信息安全信息通报中心发布了一份编号为“2019029”的名为《关于TeamViewer客户端被远程控制的紧急通报》文件,文件指出目前知名远程办公工具TeamViewer已经被境外黑客组织APT41攻破,提醒企业组织做好防护…

软件测试用例_软件测试用例设计实战场景法

不点蓝字,我们哪来故事? 目录场景法扩展例子场景法介绍影子场景法用例设计举例场景法设计用例步骤和表示场景法举例 总结 场景法的注意点场景法影子本来想直接跳过场景法的,今天群友提出问题:1、面试官问:场景…

树莓派摄像头_Arducam 8MP重磅来袭,为树莓派4B构建完全同步的双摄像头方案~

大家好,我是小月月。双目立体景深一直是很热门的项目,最近已经有不少小伙伴学会在树莓派上插两个USB摄像头了,这个方案可以识别静态场景中各个物体的距离远近。但是两个USB摄像头捕获到的两组图像序列的时间并不是严格同步的,对运…

稀疏自编码器_自编码(AutoEncoder)模型及几种扩展之二

4. 稀疏自编码假设我们只有一个没有类别标签的训练样本集合{x(1),x(2)...},一个自编码神经网络就是一种非监督学习算法,它使用BP算法,并将目标值设为: y(i)x(i)。我们的目标是希望得到hW,b(X)≈x。用aj(2)(x)表示输入向量x对隐藏层单元j的激活…

linux x86 关机 过程,linux在x86上的中断处理过程(详细)

Linux在x86上的中断处理过程一:引言在Intel的文档中,把中断分为两种。一种是异常,也叫同步同断。一种称之为中断,也叫异常中断。同步中断指的是由CPU控制单元产生,之所以称之为同步,是因为只有一条指令执行完毕后才会发出中断。例如除法运算中,除数为零的时候,就会产…

linux 显卡转码,ffmpeg用GPU转码

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?有些视频编码太屌,播放起来对CPU消耗巨大,而在电视上或者电视盒子上看视频,编码就需要合适,楼主用的FireTV Stick&a…

c语言课程设计作业五子棋,C语言课程设计报告五子棋游戏课程设计

C语言课程设计报告五子棋游戏课程设计 C语言课程设计报告_五子棋游戏-课程设计C语言课程设计报告_五子棋游戏|c语言程序代码编程小程序设计|c语言课程设计报告课程案例**********************************************************//* 本程序在Turbo C或Borland C下编译通过 */…

redis内存淘汰和持久化_redis 持久化

一、RDB持久化(一)、RDB介绍可以在指定的时间间隔内生成数据集的 时间点快照(point-in-time snapshot),新快照会覆盖老快照(二)、优点压缩格式,恢复速度快,适合于用做备份…

最新变态传奇android,新开变态传奇单职业

新开变态传奇单职业这款传奇手游中拥有这极为丰富的游戏玩法,玩家既可以进入各种副本中,挑战那些强大的副本boss,也可以和自己的兄弟好友们一起组队,前往各种跨服战场,和全服的高手玩家们一起进行最激烈的战斗。游戏中…