文章目录
前言
学习源码的时候我们为了思路不乱,需要带着具体的问题来深入剖析,接下来我们学习springboot的依赖管理,我们也是带着问题来学习的
一、为什么导入dependency时不需要指定版本?
上一篇我们搭建环境的时候创建了一个model项目spring-boot-mytest
我们可以看到默认生成的依赖中spring-boot-starter和spring-boot-starter-test依赖没有指定版本
为什么呢?
我们可以看到有一个parent标签(父依赖启动器),意思是spring-boot-starter-parent依赖是当前springboot项目的统一父依赖管理,版本号是2.6.4(这里是我自己创建model的时候指定的最新版,版本号可以修改,为了和本地源码结合,所以改成2.2.9.RELEASE)
接下来我们看一下这个父依赖的源文件,看下有什么:
我们可以看到这里还有一个parent标签,也就是说还有‘爷爷’依赖,我们先看完父依赖,如果没有解答问题的话再往上看
首先看到的是properties标签中定义了:
java的版本是1.8
编译文件格式UTF-8
编译后文件编码格式UTF-8
maven打包的版本(这里引用了java的版本,也就是1.8)
再来看build标签中主要就是两个部分:
resources标签中定义了一堆的资源过滤,可以看到后面有*通配符,表示可以支持不同环境的配置,比如application-dev.yml
pluginManagement部分就是引入了相应的插件和对应的插件版本
到这里我们很明显没有得到解答,也就是说我们在父依赖中没有找到答案,那么我们继续往上看:进入spring-boot-dependencies,看下里面具体是什么:
可以看到这里依旧有父节点,我们先来看这一层能不能解决我们的问题:
我们看到这里properties标签中已经定义好了很多的依赖的相关版本(这里的版本都是和当前SpringBoot的版本相关的,防止出现依赖版本冲突),我们知道properties标签只是一种声明,真正起作用的是dependencyManagement标签(锁定版本号)
看到这里我们就知道了,为什么部分依赖不需要指定版本号:
spring-boot-starter-parent 通过继承 spring-boot-dependencies 从而实现了SpringBoot的版本依 赖管理,所以我们的SpringBoot工程继承spring-boot-starter-parent后已经具备版本锁定等配置了
强调一下,只是部分,其他的一些没有定义的依赖还是需要自己定义或者关联定义版本号的
二、spring-boot-starter-parent父依赖启动器的主要作用是进行版本统一管理,那么项目运行依赖的JAR包是从何而来的?
我们新建的spring-boot-mytest项目中只引入了spring-boot-starter-web,但是很明显我们可以启动就说明已经引入了Tomcat相关的jar包,那么jar包是从哪来的呢?
我们之前介绍过什么是起步依赖,也就是什么是starter:就是将一系列常用的依赖打包到一起
那么我们看一下spring-boot-starter-web:
spring-boot-starter-web依赖启动器的主要作用就是打包了Web开发场景所需要的底层所有依赖,正事如此,在pom.xml中引入spring-boot-starter-web依赖启动器时,就会自动引入Tomcat服务器以及其他的Web依赖文件
SpringBoot除了Web依赖启动器以外,还提供了很多的开发场景的依赖,可以自行去官方文档搜索Starters