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 中(至少)需要包含如下的依赖:
幸好,Gradle 能够非常简洁地表达依赖。(为简单起见,我不再展现这个依赖列表在 Maven 的 pom.xml 文件是什么样子了。)即便如此,创建这个文件还是牵扯到许多的事情,而对它的维护则会更加麻烦。这些依赖之间是如何协作的呢?当应用程序不断地成长和演进,依赖管理将会变得更加具有挑战性。
但是,如果我们使用 Spring Boot Starer 所提供的预打包依赖的话,那么 Gradle 依赖列表能够更加简短一些:
可以看到,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。
Last updated