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

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

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值