Maven和Gradle为Java开发者解决了依赖管理的心头大患,已然成为事实上的依赖管理标准。但贪心的开发者还想更“懒”,有没有办法使依赖管理更简单、更快捷?

答案是肯定的,Spring Boot项目中引入了Starter的概念。

1. 诞生背景

以往开发者想要集成第三方组件,通常需要将对应的依赖添加进pom,然后进行相应集成配置工作。以jackson为例,需要的dependency有4个之多,如下:

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.7</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-jdk8</artifactId>
  <version>2.9.7</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-jsr310</artifactId>
  <version>2.9.7</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.module</groupId>
  <artifactId>jackson-module-parameter-names</artifactId>
  <version>2.9.7</version>
</dependency>

通常这些组件需要的依赖和配置差别不大,但每次使用都要做一遍,这对于“懒惰的”开发者门,实在非常不友好。于是Spring团队在分析总结常用的组件模型后,提出了Starter这个概念用以打包这些依赖和配置,从而达到了第三方组件的一站式集成的目的。

2. Stater是什么

Stater是一组依赖描述符,使开发者可以一站式依赖一些组件(包括默认配置),而不必根据这些组件的示例拷贝粘贴相关依赖配置。换言之,Starter就是Maven的一个artifact,它包含两部分内容:

1、聚合多个dependency,使依赖更方便
2、增加Auto-configuration特性,提供组件的默认配置,达到开箱即用的目的

现在以spring-boot-starter-web为例,其将web应用需要的包都加载进classpath,同时依赖spring-boot-starter开启了Auto-configuration,结构如下图:

starter-web-case

封装为Stater后的优点

1、使用Starter使依赖变得简单
2、在pom的parent约定好了版本,使开发者免除版本冲突的困扰
3、与另外一个特性Auto-configuration完美搭配,减少配置困扰

与Auto-configuration的关系

所有的Starters都必须依赖一个Auto-configuration,且Auto-configuration只应提供配置相关的内容,不应管理依赖。
Starter和Auto-configuration和配合使用后,应用程序有了一丝智能的感觉,具体情况将在另外一篇文章中详细介绍。

版本控制

观察发现所有的依赖都没有version,这些版本号都继承了spring-boot-dependencies,在其中统一管理。
不止Starter,所有其它的Spring Boot模块都继承了spring-boot-dependencies

已提供的Starters
  1. 官网内置的Staters
  2. 社区贡献的Staters
    在文章最后将官网的Starters复制了出来,以供参考。

3. 自定义Starter

构建一个自定义Starter,需要完成两个必要条件:聚合多个dependency、增加Auto-configuration特性。本文只介绍聚合多个dependency,至于Auto-configuration将在另外一篇文章中详细介绍。

聚合多个dependency

定义一个pom.xml文件,在其中依赖该模块需要的所有的依赖(包含Auto-configuration的依赖)。下图是Spring Boot中定义的Starter结构:

starter-case.png

这些pom.xml运行install后产生一个空jar,这样使Stater和Auto-configuration分离。

如果不太关注分离这两点,两者确实可以放在一起,例如Apache Wicket实现的wicket-spring-boot-starter,可以发现它不像官方的Starter一样内部只有一个pom文件,而是将Auto-configuration相关的代码也放了进去。

命名规范
官方提供的Starters命名格式为:spring-boot-starter-*
官方文档建议自定义Starter时命名为:*-spring-boot-starter,例如thirdpartyproject-spring-boot-starter,不建议以spring-boot开头。

4. 小结

本文主要介绍了Spring Boot Starter的定义及其内部构成,最后又说明了如何创建自定义的Starter。

Starter中的两个重要部分:聚合到Stater中的多个dependency、Auto-configuration特性。其中多个dependency往往根据业务场景或功能模块划分边界,而Auto-configuration为这些模块提供自动配置的特性。

附录 官网Starter列表

应用程序starters

名称 描述
spring-boot-starter 核心Spring Boot starter,包括自动配置支持,日志和YAML
spring-boot-starter-actuator 生产准备的特性,用于帮我们监控和管理应用
spring-boot-starter-amqp 对”高级消息队列协议”的支持,通过spring-rabbit实现
spring-boot-starter-aop 对面向切面编程的支持,包括spring-aop和AspectJ
spring-boot-starter-batch 对Spring Batch的支持,包括HSQLDB数据库
spring-boot-starter-cloud-connectors 对Spring Cloud Connectors的支持,简化在云平台下(例如,Cloud Foundry 和Heroku)服务的连接
spring-boot-starter-data-elasticsearch 对Elasticsearch搜索和分析引擎的支持,包括spring-data-elasticsearch
spring-boot-starter-data-gemfire 对GemFire分布式数据存储的支持,包括spring-data-gemfire
spring-boot-starter-data-jpa 对”Java持久化API”的支持,包括spring-data-jpa,spring-orm和Hibernate
spring-boot-starter-data-mongodb 对MongoDB NOSQL数据库的支持,包括spring-data-mongodb
spring-boot-starter-data-rest 对通过REST暴露Spring Data仓库的支持,通过spring-data-rest-webmvc实现
spring-boot-starter-data-solr 对Apache Solr搜索平台的支持,包括spring-data-solr
spring-boot-starter-freemarker 对FreeMarker模板引擎的支持
spring-boot-starter-groovy-templates 对Groovy模板引擎的支持
spring-boot-starter-hateoas 对基于HATEOAS的RESTful服务的支持,通过spring-hateoas实现
spring-boot-starter-hornetq 对”Java消息服务API”的支持,通过HornetQ实现
spring-boot-starter-integration 对普通spring-integration模块的支持
spring-boot-starter-jdbc 对JDBC数据库的支持
spring-boot-starter-jersey 对Jersey RESTful Web服务框架的支持
spring-boot-starter-jta-atomikos 对JTA分布式事务的支持,通过Atomikos实现
spring-boot-starter-jta-bitronix 对JTA分布式事务的支持,通过Bitronix实现
spring-boot-starter-mail 对javax.mail的支持
spring-boot-starter-mobile 对spring-mobile的支持
spring-boot-starter-mustache 对Mustache模板引擎的支持
spring-boot-starter-redis 对REDIS键值数据存储的支持,包括spring-redis
spring-boot-starter-security 对spring-security的支持
spring-boot-starter-social-facebook 对spring-social-facebook的支持
spring-boot-starter-social-linkedin 对spring-social-linkedin的支持
spring-boot-starter-social-twitter 对spring-social-twitter的支持
spring-boot-starter-test 对常用测试依赖的支持,包括JUnit, Hamcrest和Mockito,还有spring-test模块
spring-boot-starter-thymeleaf 对Thymeleaf模板引擎的支持,包括和Spring的集成
spring-boot-starter-velocity 对Velocity模板引擎的支持
spring-boot-starter-web 对全栈web开发的支持, 包括Tomcat和spring-webmvc
spring-boot-starter-websocket 对WebSocket开发的支持
spring-boot-starter-ws 对Spring Web服务的支持

Spring Boot生产准备的starters

名称 描述
spring-boot-starter-actuator 添加生产准备特性,比如指标和监控
spring-boot-starter-remote-shell 添加远程ssh shell支持

排除或交换具体技术方面的starters

名称 描述
spring-boot-starter-jetty 导入Jetty HTTP引擎(作为Tomcat的替代)
spring-boot-starter-log4j 对Log4J日志系统的支持
spring-boot-starter-logging 导入Spring Boot的默认日志系统
spring-boot-starter-tomcat 导入Spring Boot的默认HTTP引擎
spring-boot-starter-undertow 导入Undertow HTTP引擎(作为Tomcat的替代)

文章作者: 沉迷思考的鱼
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 沉迷思考的鱼 !
评论
 上一篇
Spring Boot Auto-configuration 自动配置详解 Spring Boot Auto-configuration 自动配置详解
毋庸置疑,Auto-configuration是Spring Boot的核心特性,其约定大于配置的思想,赋予了Spring Boot开箱即用的强大能力。本文从诞生背景、使用方式、实现原理这几个方面详细介绍这一特性。 1. 诞生背景一直以来
2018-12-05
下一篇 
Spring Boot 入门介绍 Spring Boot 入门介绍
一个完善的应用程序,常常需要这些特性:精简明确的配置,快速集成第三方组件,统一的打包部署方式,方便单元测试/功能测试,良好的监控能力等。Spring Boot出现之前,这些都需要开发者自行摸索解决,得到的方案可能大同小异,在尝到“约定大于配
2018-11-27
  目录