
5.2 Spring Boot之依赖管理
打开IDEA编辑器,进入在第4章中创建的newbee-mall项目。打开pom.xml文件,可以看到在该Spring Boot项目的pom.xml文件中配置了一个parent属性,其代码如下所示:

该项目依赖一个父项目,这个父项目是spring-boot-starter-parent。为了了解这个父项目的作用,按住Ctrl键并点击spring-boot-starter-parent,如图5-1所示。

图5-1 按住Ctrl键并点击spring-boot-starter-parent
在点击后会进入spring-boot-starter-parent-2.3.7.RELEASE.pom文件,查看其源码(节选):

通过源码可以看到,在pom文件中仅仅定义了JDK所需的版本为1.8、项目的默认编码UTF-8和Maven项目编译设置。也就是说该pom文件定义了Maven构建插件等基础配置的属性。继续查看源码会发现,该pom文件也依赖了一个父项目spring-boot- dependencies。
同样的做法,按住Ctrl键并点击spring-boot-dependencies,进入spring-boot- dependencies-2.3.7.RELEASE.pom文件中,查看其源码(节选):


其实整个pom.xml文件有3000多行,在该文件中定义了大量的依赖信息,如commons相关依赖、log相关依赖、数据库相关依赖、Spring相关依赖、ElasticSearch搜索引擎相关依赖、消息队列相关依赖等。在J2EE项目开发中所涉及的大部分功能场景的依赖都定义在该文件中。
这里就是Spring Boot项目依赖的版本管理中心。
版本管理中心已经默认配置好大部分依赖的版本信息。这些版本信息随着Spring Boot版本的更新也会随之更改。这种设计让开发人员在今后导入依赖时不需要写版本号,直接使用Spring Boot提供的默认版本即可。当然开发人员也可以自行修改版本号。如果不是dependencies中默认管理的依赖,就需要声明其版本号。
结合Spring Boot约定优于配置的特性,可以这样理解:Spring Boot为开发人员设置了默认编码、默认JDK版本及Maven编译的默认设置,同时维护了一套项目依赖的配置,相关依赖可直接导入,并不需要声明其版本号。
这就是Spring Boot与开发人员之间做出的一个开发约定。如果认可这个约定就可以减少一些基本配置和很多依赖配置;如果不认可这种方式也可以自行配置,这些配置会将默认配置覆盖。
在pom.xml文件中一个需要关注的地方是spring-boot-starter-web,即在创建Spring Boot项目时选择的Web模块。spring-boot-starter-web的版本号已经默认配置好了,查看spring-boot-dependencies-2.3.7.RELEASE.pom文件可知其版本号为2.3.7.RELEASE,如图5-2所示。

图5-2 spring-boot-starter-web的版本号
这个依赖配置有什么作用呢?
接下来,继续按住Ctrl键并点击该文件,进入spring-boot-starter-web- 2.3.7.RELEASE. pom文件中,查看其源码:


查看该配置文件可以发现,原来Spring MVC所需的依赖和内置的Tomcat依赖都已经定义在该文件中了。这也是为什么在开发HelloController时,仅仅在pom.xml文件中加入spring-boot-starter-web场景启动器,就可以进行Web项目的开发。
结合Spring Boot约定优于配置的特性,可以这样理解:Spring Boot的场景启动器默认已经维护好了在该场景中所需的依赖jar包,导入场景启动器即可进行该场景的功能开发。其他类似的场景启动器,如数据库连接场景启动器、模板引擎场景、缓存整合场景等功能的开发,开发人员都不需要专门维护依赖版本或者解决版本带来的冲突问题。