# 21.1.1　添加 Starter 依赖

有两种烤制蛋糕的方式，有热情的人会将面粉、鸡蛋、糖、发酵粉、盐、奶油、香草调料以及牛奶混合在一起，和成糊状。或者也可以购买预先打包好的蛋糕，它包含了所需的大部分原料，我们只需添加一些含水分的材料即可，如水、鸡蛋和植物油。

预先打包好的蛋糕将制作蛋糕过程中所需的各种材料集合在了一起，作为一项材料来使用，与之类似，Spring Boot Starter 将应用所需的各种依赖聚合成一项依赖。

为了阐述该功能，假设我们要从头开始编写一个新的 Spring 应用。这是一个 Web 项目，所以需要使用 Spring MVC。同时，还要有 REST API 将资源暴露为 JSON，所以在构建中需要包含 Jackson JSON 库。

因为应用需要使用 JDBC 从关系型数据库中存储和查询数据，因此我们希望确保包含了 Spring 的 JDBC 模块（为了使用 JdbcTemplate）和 Spring 的事务模块（为了使用声明式事务的支持）。对于数据库本身，H2 数据库是个不错的选择。

对了，我们还需要使用 Thymeleaf 来建立 Spring MVC 视图。

如果使用 Gradle 构建项目的话，在 build.gradle 中（至少）需要包含如下的依赖：

```
dependencies {
  compile("org.springframework:spring-web:4.0.6.RELEASE")
  compile("org.springframework:spring-webmvc:4.0.6.RELEASE")
  compile("com.fasterxml.jackson.core:jackson-databind:2.2.2")
  compile("org.springframework:spring-jdbc:4.0.6.RELEASE")
  compile("org.springframework:spring-tx:4.0.6.RELEASE")
  compile ("com.h2database:h2:1.3.174")
  compile("org.thymeleaf:thymeleaf-spring4:2.1.2.RELEASE")
}
```

幸好，Gradle 能够非常简洁地表达依赖。（为简单起见，我不再展现这个依赖列表在 Maven 的 pom.xml 文件是什么样子了。）即便如此，创建这个文件还是牵扯到许多的事情，而对它的维护则会更加麻烦。这些依赖之间是如何协作的呢？当应用程序不断地成长和演进，依赖管理将会变得更加具有挑战性。

但是，如果我们使用 Spring Boot Starer 所提供的预打包依赖的话，那么 Gradle 依赖列表能够更加简短一些：

```
dependencies {
  compile("org.springframework.boot:spring-boot-starter-web:1.1.4.RELEASE")
  compile("org.springframework.boot:spring-boot-starter-jdbc:1.1.4.RELEASE")
  compile ("com.h2database:h2:1.3.174")
  compile("org.thymeleaf:thymeleaf-spring4:2.1.2.RELEASE")
}
```

可以看到，Spring Boot 的 Web 和 JDBC Starter 取代了几个更加细粒度的依赖。我们依然还需要包含 H2 和 Thymeleaf 的依赖，不过其他的依赖都已经放到了 Starter 中。除了依赖列表更加简短，我们可以相信由 Starter 所提供的依赖版本能够互相兼容。

Spring Boot 提供了多个 Starter，Web 和 JDBC 只是其中的两个。表 21.1 列出了我在编写本章时，所有可用的 Starter。

| Starter                              | 所提供的依赖                                                                                                                                                                                            |
| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| spring-boot-starter-actuator         | spring-boot-starter 、spring-boot-actuator 、spring-core                                                                                                                                            |
| spring-boot-starter-amqp             | spring-boot-starter 、spring-boot-rabbit 、spring-core 、spring-tx                                                                                                                                   |
| spring-boot-starter- aop             | spring-boot-starter 、spring-aop 、AspectJ Runtime 、AspectJ Weaver 、spring-core                                                                                                                     |
| spring-boot-starter- batch           | spring-boot-starter 、HSQLDB 、spring-jdbc 、spring-batch-core 、spring-core                                                                                                                          |
| spring-boot-starter-elasticsearch    | spring-boot-starter、 spring-data-elasticsearch、 spring-core 、 spring-tx                                                                                                                           |
| spring-boot-starter-gemfire          | spring-boot-starter、 Gemfire、 spring-core、 spring-tx、spring-context、 spring-context-support、 spring-data-gemfire                                                                                  |
| spring-boot-starter- data-jpa        | spring-boot-starter、 spring-boot-starter-jdbc、 spring-boot-starter- aop、 spring-core、 Hibernate EntityManager、 spring-orm 、 spring-data-jpa、 spring-aspects                                       |
| spring-boot-starter-data-mongodb     | spring-boot-starter、 MongoDB Java 驱动 、 spring-core、spring-tx、 spring-data-mongodb                                                                                                                 |
| spring-boot-starter-datarest         | spring-boot-starter、 spring-boot-starter-web、 Jackson 注解、 Jackson 数据绑定 、 spring-core、 spring-tx、 spring-data-rest-webmvc                                                                          |
| spring-boot-starter-datasolr         | spring-boot-starter、 Solrj、 spring-core、 spring-tx、spring-data-solr、 Apache HTTP Mime                                                                                                             |
| spring-boot-starter-freemarker       | spring-boot-starter、 spring-boot-starter-web、 Freemarker、spring-core、 spring-context-support                                                                                                      |
| spring-boot-starter-groovy-templates | spring-boot-starter、 spring-boot-starter-web、 Groovy、Groovy 模板、spring-core                                                                                                                        |
| spring-boot-starter-hornetq          | spring-boot-starter、 spring-core、 spring-jms、 Hornet JMS Client                                                                                                                                   |
| spring-boot-starter-integration      | spring-boot-starter、 spring-aop、 spring-tx、 spring-web、spring-webmvc、 spring-integration-core、 spring-integration-file 、 spring-integration-http、 spring-integration-ip、spring-integration-stream |
| spring-boot-starter- jdbc            | spring-boot-starter、 spring-jdbc 、tomcat-jdbc、 spring-tx                                                                                                                                          |
| spring-boot-starter- jetty           | jetty-webapp、 jetty-jsp                                                                                                                                                                           |
| spring-boot-starter- log4j           | jcl-over-slf4j、 jul-to-slf4j 、slf4j-log4j12、log4j                                                                                                                                                 |
| spring-boot-starter - logging        | jcl-over-slf4j、 jul-to-slf4j 、log4j-over-slf4j、 logback-classic                                                                                                                                   |
| spring-boot-starter-mobile           | spring-boot-starter、 spring-boot-starter-web、 spring-mobile-device                                                                                                                                |
| spring-boot-starter- redis           | spring-boot-starter、 spring-data-redis、 lettuce                                                                                                                                                   |
| spring-boot-starter-remote- shell    | spring-boot-starter-actuator、 spring-context、 org.crashub.\*\*                                                                                                                                    |
| spring-boot-starter-security         | spring-boot-starter、 spring-security-config、 spring-security- web、 spring-aop、 spring-beans、 spring-context、spring-core、 spring-expression、 spring-web                                            |
| spring-boot-starter-social-facebook  | spring-boot-starter、 spring-boot-starter-web、 spring-core、spring-social-config、 spring-social-core、 spring-social-web 、 spring-social-facebook                                                    |
| spring-boot-starter-social-twitter   | spring-boot-starter、 spring-boot-starter-web、 spring-core、spring-social-config、 spring-social-core、 spring-social-web 、 spring-social-twitter                                                     |
| spring-boot-starter-social-linkedin  | spring-boot-starter、 spring-boot-starter-web、 spring-core、spring-social-config、 spring-social-core、 spring-social-web 、 spring-social-linkedin                                                    |
| spring-boot-starter                  | spring-boot、 spring-boot-autoconfigure、 spring-boot-starter-logging                                                                                                                               |
| spring-boot-starter- test            | spring-boot-starter-logging、 spring-boot、 junit、mockito-core 、 hamcrest-library、 spring-test                                                                                                      |
| spring-boot-starter-thymeleaf        | spring-boot-starter、 spring-boot-starter-web、 spring-core、thymeleaf-spring4、 thymeleaf-layout-dialect                                                                                             |
| spring-boot-starter-tomcat           | tomcat-embed-core、 tomcat-embed-logging-juli                                                                                                                                                      |
| spring-boot-starter- web             | spring-boot-starter、 spring-boot-starter-tomcat、 jackson-databind 、 spring-web、 spring-webmvc                                                                                                     |
| spring-boot-starter-websocket        | spring-boot-starter-web、 spring-websocket、 tomcat-embed-core 、 tomcat-embed-logging-juli                                                                                                          |
| spring-boot-starter- ws              | spring-boot-starter、 spring-boot-starter-web、 spring-core、spring-jms、 spring-oxm、 spring-ws-core、 spring-ws-support                                                                               |

如果查看这些 Starter 依赖的内部原理，你会发现 Starter 的工作方式也没有什么神秘之处。它使用了 Maven 和 Gradle 的依赖传递方案，Starter 在自己的 pom.xml 文件中声明了多个依赖。当我们将某一个 Starter 依赖添加到 Maven 或 Gradle 构建中的时候，Starter 的依赖将会自动地传递性解析。这些依赖本身可能也会有其他的依赖。一个 Starter 可能会传递性地引入几十个依赖。

需要注意，很多 Starter 引用了其他的 Starter。例如，mobile Starter 就引用了 Web Starter，而后者又引用了 Tomcat Starter。大多数的 Starter 都会引用 spring-boot-starter，它实际上是一个基础的 Starter（当然，它也依赖了 logging Starter）。依赖是传递性的，将 mobile Starter 添加为依赖之后，就相当于添加了它下面的所有 Starter。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://potoyang.gitbook.io/spring-in-action-v4/untitled-14/untitled-4/untitled-3.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
