SpringBoot是怎么对依赖进行自动管理的?SpringBoot的场景启动器究竟是什么?看这一篇


前言

在普通的spring项目的中我们需要自己去定义依赖的版本,经常会遇到jar包冲突的情况。而SpringBoot会帮我们自动管理这些依赖的版本,给我们的开发省去了不必要的麻烦,提高我们的开发效率。这篇文章就来介绍一下SpringBoot是怎么对依赖进行自动管理的。


一、parent标签和dependencyManagement标签

在平时的开发中,我们经常需要用到一些依赖,而在使用springboot时,我们引入的依赖很多不需要指定依赖的版本,但是maven却能够给我们下载正常的jar包,如下所示。

		<!--web场景-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!--redis缓存-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
		<!--thymeleaf模板-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>

下面就来说明一下springboot是怎么做到的依赖版本的自动管理。

1.在pom.xml文件中,可以看到,存在一个父项目,如下所示,父项目就是实现依赖管理的。
在这里插入图片描述
2.按住Ctrl,点击spring-boot-starter-parent,发现其还存在一个父项目spring-boot-dependencies。
在这里插入图片描述
3.按住Ctrl,点击spring-boot-dependencies,进入内部,可以看到其声明了很多的版本号,以及使用dependencyManagement元素提供了一种管理依赖版本号的方式。

 <properties>
   <activemq.version>5.15.15</activemq.version>
    <antlr2.version>2.7.7</antlr2.version>
    <appengine-sdk.version>1.9.89</appengine-sdk.version>
    <artemis.version>2.12.0</artemis.version>
    <aspectj.version>1.9.6</aspectj.version>
    <assertj.version>3.16.1</assertj.version>
    <atomikos.version>4.0.6</atomikos.version>
    <awaitility.version>4.0.3</awaitility.version>
    <bitronix.version>2.1.4</bitronix.version>
    <build-helper-maven-plugin.version>3.1.0</build-helper-maven-plugin.version>
    <byte-buddy.version>1.10.22</byte-buddy.version>
    <caffeine.version>2.8.8</caffeine.version>
    <cassandra-driver.version>4.6.1</cassandra-driver.version>
    <classmate.version>1.5.1</classmate.version>
    <commons-codec.version>1.14</commons-codec.version>
    <commons-dbcp2.version>2.7.0</commons-dbcp2.version>
    <commons-lang3.version>3.10</commons-lang3.version>
    <commons-pool.version>1.6</commons-pool.version>
    <commons-pool2.version>2.8.1</commons-pool2.version>
     <!--下面还有很多,可以自己到里面去看-->
     
  </properties>
<dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-amqp</artifactId>
        <version>${activemq.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-blueprint</artifactId>
        <version>${activemq.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-broker</artifactId>
        <version>${activemq.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-camel</artifactId>
        <version>${activemq.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-client</artifactId>
        <version>${activemq.version}</version>
      </dependency>
      <!--下面还有很多,可以自己到里面去看-->
  
</dependencyManagement>

1. 在这个顶级的pom文件中,properties标签中主要是管理了各个依赖的版本号
2. dependencyManagement标签里面声明了常用的依赖并在version中使用了上面properties的属性值,定义依赖的版本。
3. 而我们在自己的项目中如果需要使用某个依赖,只需要声明groupId和artifacted就可以引用到这个pom里面声明的依赖和对应的版本。

注意:在dependencyManagement元素中声明所依赖的jar包的版本号等信息,那么所有子项目再次引入此依赖jar包时则无需显式的列出版本号。Maven会沿着父子层级向上寻找拥有dependencyManagement 元素的项目,然后使用它指定的版本号。

但是要注意dependencyManagement标签只是对版本进行声明,不会实际引入jar 。只有在项目中显式的声明依赖,maven才会真正的去给项目下载这个依赖的jar。

<!--只是对版本进行管理,不会实际引入jar  -->
<dependencyManagement>  
      <dependencies>  
            <dependency>  
                <groupId>org.springframework</groupId>  
                <artifactId>spring-core</artifactId>  
                <version>3.2.7</version>  
            </dependency>  
    </dependencies>  
</dependencyManagement>  

<!--会实际下载jar包-->
<dependencies>  
       <dependency>  
                <groupId>org.springframework</groupId>  
                <artifactId>spring-core</artifactId>  
       </dependency>  
</dependencies> 

优点:如果有多个子项目都引用同一样依赖,则可以避免在每个使用的子项目里都声明一个版本号。当想升级或切换到另一个版本时,只需要在顶层父容器里更新,而不需要逐个修改子项目;另外如果某个子项目需要另外的一个版本,只需要声明version即可。


二、场景启动器

为什么引入场景启动器?

  1. 在传统方式下,所有jar包需要手动引入,很麻烦
  2. jar包的版本号问题,可以会发生冲突,需要不停调试

SpringBoot场景启动器:SpringBoot将所有的功能场景都抽取出来,称为spring-boot-starter,主要是帮我们导入各种开发场景下所依赖的组件做成一个个的starter(启动器)。开发人员只需要在项目里面引入这些starter,相关场景的所有依赖都会导入进来,要用什么功能就导入什么场景的启动器。
SpringBoot所有支持的场景官方文档介绍链接

例如:当我们需要某个场景的时候,比如我们需要web开发,那么在springboot中我们只需要引入相应的场景启动器,它会帮我们将这个场景下的所有依赖都引入进来,减少了许多繁杂的配置。
1.引入spring-boot-starter-web依赖

<!--web场景-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.按住Ctrl,点击spring-boot-starter-web进入,可以看到其还有很多相关的依赖,这些相关依赖springboot也帮我们引入了。

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <version>2.3.12.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-json</artifactId>
      <version>2.3.12.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
      <version>2.3.12.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>5.2.15.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.15.RELEASE</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>

总结

springboot在父项目中定义了很多版本号,帮助开发人员把版本号管理起来。同时将所有的功能场景都抽取出来,称为spring-boot-starter,开发人员只需要在项目里面引入这些starter,相关场景的所有依赖都会导入进来,使用起来非常方便。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JinziH Never Give Up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值