目录
一. 🦁 依赖管理
Ⅰ. 部分dependency导入时为啥不需要指定版本?
我们创建项目时添加的依赖并没有帮我们指定版本号version,那SpringBoot是如何来指定版本账号的呢?
现在我们来剥析一下SpringBoot的父依赖启动器spring-boot-parent
<!-- SpringBoot父项目依赖管理--><parent><artifactId>spring-boot-parent</artifactId><groupId>org.springframework.boot</groupId><version>2.2.9.RELEASE</version><relativePath/><!-- 查看本地仓库的源码 --></parent>
1.1 父依赖启动器的工作
鼠标指针停留在spring-boot-parent上Ctrl + 鼠标左键点击进去,我们来看看这个父依赖启动器负责什么工作:
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${revision}</version><relativePath>../spring-boot-dependencies</relativePath></parent>
首先进去发现:这个父依赖启动器有一个爸爸spring-boot-dependencies,如上!这个我们后面深入剥析!!!
然后接下看👇
<properties><main.basedir>${basedir}/../..</main.basedir><disable.checks>false</disable.checks><git.url>https://github.com/spring-projects/spring-boot</git.url><git.connection>scm:git:git://github.com/spring-projects/spring-boot.git</git.connection><git.developerConnection>scm:git:ssh://[email protected]/spring-projects/spring-boot.git</git.developerConnection><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><maven.version>3.5.4</maven.version><maven-resolver.version>1.1.1</maven-resolver.version><spock.version>1.3-groovy-2.5</spock.version><spring-asciidoctor-extensions.version>0.4.0.RELEASE</spring-asciidoctor-extensions.version><spring-doc-resources.version>0.1.3.RELEASE</spring-doc-resources.version><spring-doc-resources.url>https://repo.spring.io/release/io/spring/docresources/spring-doc-resources/${spring-doc-resources.version}/spring-doc-resources-${spring-doc-resources.version}.zip</spring-doc-resources.url><testcontainers.version>1.12.5</testcontainers.version><testng.version>6.14.3</testng.version></properties>
看到这里进行了一个属性声明,声明了jdk版本,编码格式以及打包编译后的版本等;但是这里仅仅只是声明!!!
我们接着👇
这个部分是SpringBoot的插件管理
tips:
这里的pluginManagement 管理模块插件所需要的版本号,所以在我们在导入插件时,也不需要导入插件版本控制。
1.2 问题答案
我们Ctrl+鼠标右键点击spring-boot-dependencies,一进来就看到了一系列的版本号:
这里就声明了很多第三方框架的版本号,这里对应的是2.2.9.RELEASE的版本号,如果更改SpringBoot版本则这里的版本也会变化。但是正如前面所说,properties也还只是声明而已!!!
我们接着👇
决定项目不需要导入版本号的原因还得是dependencyManagement
tips:
spring-boot-starter-parent 通过继承spring-boot-dependencies 从而实现了SprngBoot的本依赖营理,所以我的Springboot工程继承spring-boot-starter-parent后已经具备版本锁定等配置了,这也就是在 Spring Boot 项目中部分依赖不需要写版本号的原因。
Ⅱ. 项目运行依赖的JAR包是从何而来的?
Spring-Boot-Starter-Parent父依赖启动器的主要作用是进行版本统一管理,那么项目运行依赖的JAR包是从何而来的?
2.1 分析源码
我们以<>为突破口,我们依旧是Ctrl+鼠标左键点进去,在spring-boot-starter-web里面很明显看到了一系列的依赖管理:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-json</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId><exclusions><exclusion><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-el</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId></dependency></dependencies>
我们只在pom.xml里面引入了spring-boot-starter-web一个依赖(也就是直接依赖了web依赖启动器),而里面依赖了tomcat,springmvc等等,则说明这个过程中进行了依赖传递,而我们点击任何一个web依赖启动器里面的依赖时发现,里面依然还有很多依赖,以tomcat为例:
里面仍然包含了启动tomcat所需要的全部依赖。
2.2 问题答案
到这里我们就可以知道spring-boot-starter-web依赖启动器的主要作用就是打包了Web开发场景所有的依赖(基于依赖传递的方式,加载当前仓库里对应的jar包)。
- 正是如此,在pom.xml中引入spring-boot-stater-web依赖启动器时,就可以实现Web场原开发,而不需要额外导入Tomcat服务战以及其他Web依赖文件等当然,这些引入的依赖文件的版本号还是由spring-boot-starter-parent父依赖进行的统一管理(这也是SpringBoot约定大于配置的一个重要体现)
- Spring Boot除了提供有上述介绍的Web依赖启动器外,还提供了其他许多开发场景的相关依赖。
二. 🦁 总结
依赖管理的源码分解就到这里,咱们下期见!!!
版权归原作者 狮子也疯狂 所有, 如有侵权,请联系我们删除。