Spring boot系列4 - 依赖管理

Spring boot starters缘起

在spring boot出现之前,当我需要开发一个spring web应用时,总是先找出一些最基本的依赖,确定它们的版本号,然后看它们是否能够相互兼容。这在项目的开始阶段似乎也没有多大问题,一切都很顺利。然而随着项目越来越庞大,问题便随之而来,大量的依赖库和传递依赖问题开始出现,相互冲突的依赖常常花费我大量的宝贵时间,有时甚至连部分代码都要重写。面对这种折磨我也只能听之任之,束手无策。spring boot的出现彻底改变了这种尴尬的局面,似乎负责spring开发的这帮大佬们总能体会到我们程序员的痛苦,这也使本就生机勃勃的spring框架更加神采奕奕。在使用了spring boot的情况下,我们不需要再声明依赖包的版本号,不需要再担心兼容性问题,甚至不需要声明具体的依赖包。在享受着spring boot所带来的幸福感的同时,好奇心也驱使我对它如何实现这个功能进行一番探究。

什么是starters

starters的主要目的是让我们方便的添加项目所依赖的jar包,它们被称为依赖描述符,每一个starter代表了某个功能模块,例如web、jdbc等,并且定义了这个功能对应的一个或者多个依赖包。我们只需要在项目中引入starter,相应的依赖包便会自动加入到classpath下面。所有的starter都遵循相同的命名模式spring-boot-starter-*。
本质上来说starter主要提供了两方面的便利性:

一致性的依赖管理

它通过和spring-boot-dependencies相结合,帮助我们指定了依赖包和依赖包的版本号并保证兼容性。

使包的管理更加模块化

starter把一个或者多个依赖包抽象成了一个功能模块,从而更方便管理。

Spring boot依赖管理的基本原理

让我们从头开始说起,在一个最简单的spring web项目中,首先我们的项目继承了spring-boot-starter-parent这个pom,虽然它声明了很多的东西,但和依赖管理密切相关的则是它继承的pom,也就是spring-boot-dependencies,在spring-boot-dependencies项目对应的pom文件中,它声明了大量常用依赖和对应的版本号,这可以从下图看出:
在这里插入图片描述
在这里插入图片描述
spring boot保证了所有这些包以及它们的依赖包之间是相互兼容的,当然它只是声明了这些依赖,而不是引入了所有这些依赖,如果想使用这些包,还需要引入它们。
我们当然也可以直接引入这些包,但是spring boot走的更远,它通过引入各种starter模块,使得对这些包的使用得到了进一步的简化。starter模块是以jar包的形式存在的,并且按照各种功能分门别类,如果我们想要使用它们,只需要确定我们需要什么功能就可以了。例如,我想要开发web应用,只需要引入spring-boot-starter-web
在这里插入图片描述
具体需要引入的包由它自己负责管理,让我们来看下它都引入了什么依赖:
在这里插入图片描述
它引入了不少的包,而且在具体的包上并没有指定版本号,这个已经由spring-boot-dependencies负责统一指定了。从这儿也可以看出, spring-boot-dependencies声明了所有常用的包并保证了包之间的兼容性,而starter则对包的管理进行了进一步的抽象,使得依赖管理更加模块化。
这可以简单总结为下图:
这儿还有一点没有画出来,就是starter也可以依赖其他的starter,这样可以更方便管理依赖。对于我来说,在平时的项目开发中所需要做的就是引入spring boot的parent作为父pom,同时引入各种starter依赖。
在这里插入图片描述

当spring boot指定的依赖包的版本不是我们所需时

在完美的世界中,一切都是完美的。而在现实中,总有不完美的情况,当spring boot所指定的依赖包的版本完全符合我们的需求时,一切都很好。但是,如果它所指定的jar包不符合我们的版本怎么办呢,例如在spring boot 2.3.1中,它声明了对elasticsearch的依赖包的版本号为7.6.2,而我安装的elasticsearch却是5.6.10的版本,如果新版本能够兼容老版本,我也不需要做什么。但是恰好7.6.2并不兼5.6.10,因此,我得重新声明elasticsearch的版本号,而此时elasticsearch和其他包之间的兼容性得由我自己保证。
在这里插入图片描述

当我的项目有自己的parent pom时怎么办

假如我们需要自己的parent pom而不是spring boot怎么办呢,这在多模块项目中是很常见的。其实只需要把spring-boot-dependencies加入到依赖管理中,同时声明依赖的scope为import就可以了。这让我们仍然可以使用spring boot的依赖管理,但是如果想要使用spring boot的插件或者修改单独的依赖版本,则需要做出额外的配置。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值