概述
在传统的软件开发过程中,随着项目库数量及其依赖关系的指数增长,依赖管理开始成为一件麻烦的事情,对于任何大型复杂的软件应用而言更是如此。为了解决这个问题,软件项目管理和理解工具(Software project management and comprehension tool)应运而生。我们所熟知的,如Python中的pip,PHP中的Composer,Java中的Maven、Gradle等,这些工具的出现使得应用程序的开发效率大大提高。以Maven为例,开发者可以使用Maven工具在Apache官方维护的中央仓库 https://search.maven.org/ 或其他第三方知名Maven仓库如 https://mvnrepository.com/ 上面方便地查询和获取依赖,相比传统的手动添加方式,依赖管理变得更方便了。但这还不足以解决所有依赖管理的痛点,如重复加载、版本不兼容或冲突等依赖管理问题依然存在。
认识起步依赖
起步依赖就是为了避免上面提到的问题出现在Spring Boot应用开发中而准备的。Spring Boot官方专门封装和维护了一套起步依赖描述符,你可以在应用程序中包含这些描述符,从而获得你所需要的所有Spring相关技术的一站式服务,而无需担心依赖会出现重复加载或版本冲突等问题。官方提供的起步依赖描述符遵循类似于spring-boot-starter- 的命名模式, 是指特定类型的应用程序。如spring-boot-starter-data-jpa根据jpa就可以知道是用于数据的持久化(Java Persistence API),它包含了下面的依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starters</artifactId> <version>${revision}</version> </parent> <artifactId>spring-boot-starter-data-jpa</artifactId> <name>Spring Boot Data JPA Starter</name> <description>Starter for using Spring Data JPA with Hibernate</description> <properties> <main.basedir>${basedir}/../../..</main.basedir> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>javax.transaction</groupId> <artifactId>javax.transaction-api</artifactId> </dependency> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <exclusions> <exclusion> <groupId>org.jboss.spec.javax.transaction</groupId> <artifactId>jboss-transaction-api_1.2_spec</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <exclusions> <exclusion> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> </exclusion> <exclusion> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> </dependency> </dependencies> </project>
第三方也可以创建和开发自己的起步依赖,但不能以spring-boot开头,因为它是为Spring Boot官方保留的。Spring Boot官方提供了超过30多个的起步依赖,下面是官方起步依赖的列表
使用起步依赖
spring-boot-starter-parent是一个特殊的起步依赖,也是整个Spring Boot应用的父级依赖,它提供有用的Maven默认值,要在其他依赖引入之前引入。指定了spring-boot-starter-parent的版本号,后面引入的其他起步依赖的版本号就可以省略。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>myproject</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> </parent> <!-- Additional lines to be added here... --> </project>
父类起步依赖确定后,其他的起步依赖按需引入即可。下面是引入spring-boot-starter-web起步依赖的示例
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
这一节的代码可在 https://github.com/HuasLeung/spring-boot-tutorial 下载,本系列的教程已经同步到我的个人网站 https://www.huasleung.com , 有任何疑问或问题也欢迎到我的博客下提问和讨论。