SpringBoot起步依赖的原理

一、简述

首先在springboot项目中有一个重要的依赖:spring-boot-starter-parent 

1.而在spring-boot-starter-parent中定义了各种技术的版本信息,通过良性测试组合了一套最优搭配的技术版本,并通过dependencyManagement进行了版本锁定

2.springboot有非常多的启动器starter, 在各种starter中都定义完成了该功能所需要的坐标合集,当然其中大部分版本信息来自于父工程。

3.当我们自己的工程集成父工程parent,引入对应的starter后(不再需要定义版本号),通过依赖传递,就可以简单方便的获取需要的jar包,并且不会存在版本冲突的问题。

常用的启动器

  • spring-boot-starter-web
  • spring-boot-starter-test
  • spring-boot-starter-redis
  • spring-boot-starter-security
  • spring-boot-starter-aop
二、分析
1.spring-boot-starter-parent
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.5.RELEASE</version>
</parent>

2.当我们点击进去之后 会发现 spring-boot-starter-parent 这个父工程 还依赖于另一个parent

即:spring-boot-dependencies

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.2.5.RELEASE</version>
    <relativePath>../../spring-boot-dependencies</relativePath>
</parent>

3.在点击之后  就没有父依赖了 也就是在这个文件中定义了大量技术的版本,并使用<dependencyManagement>进行了版本控制

  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-dependencies</artifactId>
  <version>2.2.5.RELEASE</version>
  <packaging>pom</packaging>

  (1)在这个pom文件中定义了很多技术的版本信息

//此处只拿了一小部分
<activemq.version>5.18.4</activemq.version>
<angus-mail.version>2.0.3</angus-mail.version>
<artemis.version>2.31.2</artemis.version>
<aspectj.version>1.9.22</aspectj.version>
<assertj.version>3.24.2</assertj.version>
<awaitility.version>4.2.1</awaitility.version>
<brave.version>5.16.0</brave.version>
<build-helper-maven-plugin.version>3.4.0</build-helper-maven-plugin.version>
<byte-buddy.version>1.14.13</byte-buddy.version>
<cache2k.version>2.6.1.Final</cache2k.version>
<rabbit-amqp-client.version>5.19.0</rabbit-amqp-client.version>
<rabbit-stream-client.version>0.14.0</rabbit-stream-client.version>
<spring-security.version>6.2.4</spring-security.version>
<spring-session.version>3.2.2</spring-session.version>
<thymeleaf.version>3.1.2.RELEASE</thymeleaf.version>
<spring-batch.version>5.1.1</spring-batch.version>
<spring-data-bom.version>2023.1.5</spring-data-bom.version>
<spring-framework.version>6.1.6</spring-framework.version>
<spring-graphql.version>1.2.6</spring-graphql.version>
<spring-hateoas.version>2.2.2</spring-hateoas.version>

(2)<dependencyManagement>进行版本锁定

在这个文件中使用<dependencyManagement>进行了版本锁定 即在父工程中定义好各种版本信息(这些版本信息都是经过良好测试的),不会产生版本冲突;

当我们的工程继承了父工程之后,就不需要在定义版本信息了。

#只截取了部分 
<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>
   <dependencies>
 <dependencyManagement>

总结:

在父工程中定义了大量技术的版本信息,并进行了版本锁定,这样就可以防止在后续使用时产生版本冲入的问题

三、案例
spring-boot-starter-web

在自己项目中导入的坐标依赖示例:

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

在这个启动器中定义了一系列提供web技术支持所需要的jar包,如下:

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

这样当我们想要在springboot项目中使用到web时,就不需要把以上这些依赖一一全部导入进去,只需要导入他们的集合坐标启动器  spring-boot-starter-web就可以通过依赖传递自动导入这些jar包了。

四、启动器starter执行原理

springBoot在启动的时候会去扫描jar包中的一个名为spring.factories的文件

根据文件中的配置,去自动加载配置类,配置文件的格式是键值对的形式key-value,value中配置了很多需要Spring加载的类

Spring自动加载完这些配置类,读取之后就会创建这些类的对象对将其放到容器中去,开发者后期就可以从这些容器中获取这些类的对象了,而不需要再去手动new出一个对象了。
 

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值