Spring Boot 原理深刻 - 依赖管理

2.2 原理深刻

传统的Spring框架实现一个WEB服务,须要导入各类依赖JAR包,而后编写对应的XML配置文件等,相比较而言,Spring Boot 显得更加方便、快捷、高效。那么Spring Boot 到底是如何作到这些的呢?web

2.2.1 依赖管理

问题:为何Spring Boot导入dependency时不须要指定版本?spring

2.2.1.1 spring-boot-starter-parent
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.14.RELEASE</version>
</parent>

从上述能够看出,将spring-boot-starter-parent依赖做为Spring Boot项目的统一父项目依赖管理,并将项目版本号统一为2.1.14.RELEASE,该版本号可根据实际开发进行修改。sql

进入spring-boot-starter-parent底层源文件,发现spring-boot-starter-parent的底层有一个父依赖spring-boot-dependenciesjson

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

继续进入spring-boot-dependencies底层源文件,其核心代码以下tomcat

<properties>
   ......
    <jolokia.version>1.6.2</jolokia.version>
    <jooq.version>3.11.12</jooq.version>
    <jsonassert.version>1.5.0</jsonassert.version>
    <json-path.version>2.4.0</json-path.version>
    <jstl.version>1.2</jstl.version>
    <jtds.version>1.3.1</jtds.version>
    <junit.version>4.12</junit.version>
    <junit-jupiter.version>5.3.2</junit-jupiter.version>
    <kafka.version>2.0.1</kafka.version>
    <kotlin.version>1.2.71</kotlin.version>
    <lettuce.version>5.1.8.RELEASE</lettuce.version>
    <liquibase.version>3.6.3</liquibase.version>
    <log4j2.version>2.11.2</log4j2.version>
    <logback.version>1.2.3</logback.version>
    <lombok.version>1.18.12</lombok.version>
  ......
    <spring.version>5.1.15.RELEASE</spring.version>
    <spring-amqp.version>2.1.14.RELEASE</spring-amqp.version>
    <spring-batch.version>4.1.4.RELEASE</spring-batch.version>
    <spring-cloud-connectors.version>2.0.7.RELEASE</spring-cloud-connectors.version>
    <spring-data-releasetrain.version>Lovelace-SR17</spring-data-releasetrain.version>
    <spring-framework.version>${spring.version}</spring-framework.version>
    <spring-hateoas.version>0.25.2.RELEASE</spring-hateoas.version>
    <spring-integration.version>5.1.10.RELEASE</spring-integration.version>
    <spring-kafka.version>2.2.13.RELEASE</spring-kafka.version>
    <spring-ldap.version>2.3.3.RELEASE</spring-ldap.version>
    <spring-plugin.version>1.2.0.RELEASE</spring-plugin.version>
    <spring-restdocs.version>2.0.4.RELEASE</spring-restdocs.version>
    <spring-retry.version>1.2.5.RELEASE</spring-retry.version>
    <spring-security.version>5.1.10.RELEASE</spring-security.version>
    <spring-session-bom.version>Bean-SR10</spring-session-bom.version>
    <spring-ws.version>3.0.9.RELEASE</spring-ws.version>
    <sqlite-jdbc.version>3.25.2</sqlite-jdbc.version>
 ......
  </properties>

从底层spring-boot-dependencies底层源文件能够看出,该文件经过标签对一些经常使用技术框架的依赖文件进行了统一版本号管理,例如activemq、spring、lombok等,都有与2.1.14.RELEASE版本相匹配的版本,这也就是pom.xml引入依赖文件不须要标注依赖jar版本号的缘由。服务器

问题:spring-boot-starter-parent父依赖启动器的主要做用是进行版本统一管理,那么项目运行依赖的JAR包是从何而来?markdown

2.2.1.2 spring-boot-starter-web

查看 spring-boot-starter-web源文件源码session

<dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <version>2.1.14.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-json</artifactId>
      <version>2.1.14.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
      <version>2.1.14.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.hibernate.validator</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>6.0.19.Final</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>5.1.15.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.1.15.RELEASE</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>

从上述代码能够看出,spring-boot-starter-web依赖启动器主要做用是提供了web开发场景须要的底层全部依赖。mybatis

正是由于如此,在pom.xml中引入 spring-boot-starter-web 依赖启动器时,就能够实现web场景开发,而不须要额外导入Tomcat服务器依赖以及其余web依赖文件。mvc

固然,这些引入依赖的文件版本仍是由 spring-boot-starter-parent进行统一管理。

2.2.1.3 starter

Spring Boot除了提供上述web依赖启动器之外,还提供了许多场景所须要的依赖

Spring Boot 原理深刻 - 依赖管理
列出的是Spring Boot提供的一部分启动依赖器,还有许多,能够从spring官网上查看。不一样的场景依赖,咱们能够根据咱们不一样的业务场景,直接在pom.xml中引入便可。

可是Spring Boot官网并非针对全部的场景的开发技术框架都提供了依赖启动器,如mybatis、druid等,可是为了充分利用Spring Boot框架的优点,mybatis、druid等技术框架团队主动与Spring Boot框架进行了整合,实现了各自的依赖启动器。mybatis-spring-boot-starter、druid-spring-boot-starter。在须要的时候直接在pom.xml文件中导入便可,可是须要本身管理版本号

相关文章
相关标签/搜索