这篇文章主要介绍“SpringBoot依赖管理源码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot依赖管理源码分析”文章能帮助大家解决问题。
一. 依赖管理
Ⅰ. 部分dependency导入时为啥不需要指定版本?
我们创建项目时添加的依赖并没有帮我们指定版本号<>,那SpringBoot是如何来指定版本账号的呢?
现在我们来剥析一下SpringBoot的父依赖启动器<>
<!-- 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>
首先进去发现:这个父依赖启动器有一个爸爸<>,如上!这个我们后面深入剥析!!!
然后接下看
<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://git@github.com/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:
这里的<> 管理模块插件所需要的版本号,所以在我们在导入插件时,也不需要导入插件版本控制。
1.2 问题答案
我们Ctrl+鼠标右键点击<>,一进来就看到了一系列的版本号:
这里就声明了很多第三方框架的版本号,这里对应的是2.2.9.RELEASE的版本号,如果更改SpringBoot版本则这里的版本也会变化。但是正如前面所说,<>也还只是声明而已!!!
我们接着
决定项目不需要导入版本号的原因还得是<>
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依赖启动器外,还提供了其他许多开发场景的相关依赖。