介绍
SpringBoot的两大核心,依赖管理和自动配置。传统的Spring框架,需要导入各种依赖jar,但是Spring导入的各种starter,往往不需要额外版本号就能完美匹配。
问题1:为啥导入依赖时不需要指定版本?
- SpringBoot项目,包含了一个父依赖 spring-boot-starter-parent
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent<11./artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
- spring-boot-starter-parent作为了SpringBoot项目的统一父项目依赖管理,只需要修改这一项目版本号即可修改相关的依赖版本。
- spring-boot-starter-parent 的properties定义了一些,java的版本,编码和插件管理等信息后,还有一个父依赖。spring-boot-dependencies
- spring-boot-dependencies 中的properties中定义了大量的版本号,指定了与对应的SpringBoot版本匹配的依赖的版本。并且通过 dependencyManagement进行了版本的管理。这样的话所有子项目引入其中包含的jar时,可以不用显式的列出版本号,Maven会向上级寻找拥有dependencyManagement 的项目。使用其指定的版本号,dependencyManagement 只定义依赖的声明,并不引入实现。
问题2:项目运行时依赖的jar是哪儿来的?
-
项目引入spring-boot-starter-web 时,看起来只引入了一个jar,但是点进去之后发现其实引入了Web开发场景所需的所有底层依赖。
-
这些依赖的版本,还是由spring-boot-starter-parent父依赖进行的统一管理
-
Spring Boot除了提供有上述介绍的Web依赖启动器外,还提供了其他许多开发场景的相关依赖,打开Spring Boot官方文档,搜索“Starters”关键字查询场景依赖启动器
-
Spring Boot官方并不是针对所有场景开发的技术框架都提供了场景启动器,例如数据库操作框架MyBatis、阿里巴巴的Druid数据源等,Spring Boot官方就没有提供对应的依赖启动器。为了充分利用Spring Boot框架的优势,在Spring Boot官方没有整合这些技术框架的情况下,MyBatis、Druid等技术框架所在的开发团队主动与Spring Boot框架进行了整合,实现了各自的依赖启动器,例如mybatis-spring-boot-starter、druid-spring-boot-starter等。在pom.xml文件中引入这些第三方的依赖启动器时,要配置对应的版本号。