Spring Boot由众多Starter组成,随着版本的推移Starter家族成员也与日俱增。在传统Maven项目中通常将一些层、组件拆分为模块来管理,以便相互依赖复用,在Spring Boot项目中我们则可以创建自定义Spring Boot Starter来达成该目的。

接下来,我们演示如何创建一个spring boot starter。

先创建一个Maven项目并引入依赖,​​pom.xml​​如下:

<?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>example-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>

这里说下​​artifactId​​​的命名问题,Spring 官方 Starter通常命名为​​spring-boot-starter-{name}​​​如 ​​spring-boot-starter-web​​​, ​​Spring官方建议​​​非官方Starter命名应遵循​​{name}-spring-boot-starter​​的格式。

这里讲一下我们的Starter要实现的功能,很简单,提供一个​​Service​​​,包含一个能够将字符串加上前后缀的方法​​String wrap(String word)​​。

public class ExampleService {

private String prefix;
private String suffix;

public ExampleService(String prefix, String suffix) {
this.prefix = prefix;
this.suffix = suffix;
}
public String wrap(String word) {
return prefix + word + suffix;
}
}

前缀、后缀通过读取​​application.properties(yml)​​内的参数获得

@ConfigurationProperties("example.service")
public class ExampleServiceProperties {
private String prefix;
private String suffix;
//省略 getter setter

重点,编写​​AutoConfigure​​类

@Configuration
@ConditionalOnClass(ExampleService.class)
@EnableConfigurationProperties(ExampleServiceProperties.class)
public class ExampleAutoConfigure {

@Autowired
private ExampleServiceProperties properties;

@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "example.service",value = "enabled",havingValue = "true")
ExampleService exampleService (){
return new ExampleService(properties.getPrefix(),properties.getSuffix());
}

}

解释下用到的几个和Starter相关的注解:

  • ​@ConditionalOnClass​​​,当​​classpath​​下发现该类的情况下进行自动配置。
  • ​@ConditionalOnMissingBean​​​,当​​Spring Context​​​中不存在该​​Bean​​时。
  • ​@ConditionalOnProperty(prefix = "example.service",value = "enabled",havingValue = "true")​​​,当配置文件中​​example.service.enabled=true​​时。

更多相关注解,建议阅读​​官方文档该部分​​。

最后一步,在​​resources/META-INF/​​​下创建​​spring.factories​​文件,内容供参考下面~

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.autocinfigure.ExampleAutoConfigure

OK,完事,运行 ​​mvn:install​​打包安装,一个Spring Boot Starter便开发完成了。

创建一个Spring Boot项目来 试试~

引入​​example-spring-boot-starter​​依赖

<dependency>
<groupId>com.example</groupId>
<artifactId>example-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>

创建​​application.properties​​,进行配置

example.service.enabled=true
example.service.prefix=####
example.service.suffix=@@@@

创建一个简单的Spring Web Application,注入Starter提供的​​ExampleService​​看它能否正常工作~

@SpringBootApplication
@RestController
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

@Autowired
private ExampleService exampleService;

@GetMapping("/input")
public String input(String word){
return exampleService.wrap(word);
}

}

启动Application,访问​​/input​​接口试试看~

自定义spring boot starter_spring

总结下​​Starter​​的工作原理

  1. ​Spring Boot​​​在启动时扫描项目所依赖的JAR包,寻找包含​​spring.factories​​文件的JAR包
  2. 根据​​spring.factories​​​配置加载​​AutoConfigure​​类
  3. 根据​​@Conditional​​​注解的条件,进行自动配置并将​​Bean​​​注入​​Spring Context​

最后,列一些常用的starter:

应用启动器

 

 

1

spring-boot-starter

这是Spring Boot的核心启动器,包含了自动配置、日志和YAML。

 

2

spring-boot-starter-actuator

帮助监控和管理应用。

 

3

spring-boot-starter-amqp

通过spring-rabbit来支持AMQP协议(Advanced Message Queuing Protocol)。

 

4

spring-boot-starter-aop

支持面向方面的编程即AOP,包括spring-aop和AspectJ。

 

5

spring-boot-starter-artemis

通过Apache Artemis支持JMS的API(Java Message Service API)。

 

6

spring-boot-starter-batch

支持Spring Batch,包括HSQLDB数据库。

 

7

spring-boot-starter-cache

支持Spring的Cache抽象。

 

8

spring-boot-starter-cloud-connectors

支持Spring Cloud Connectors,简化了在像Cloud Foundry或Heroku这样的云平台上连接服务。

 

9

spring-boot-starter-data-elasticsearch

支持ElasticSearch搜索和分析引擎,包括spring-data-elasticsearch。

 

10

spring-boot-starter-data-gemfire

支持GemFire分布式数据存储,包括spring-data-gemfire。

 

11

spring-boot-starter-data-jpa

支持JPA(Java Persistence API),包括spring-data-jpa、spring-orm、Hibernate。

 

12

spring-boot-starter-data-mongodb


支持MongoDB数据,包括spring-data-mongodb。


 

13

spring-boot-starter-data-rest

通过spring-data-rest-webmvc,支持通过REST暴露Spring Data数据仓库。

 

14

spring-boot-starter-data-solr

支持Apache Solr搜索平台,包括spring-data-solr。

 

15

spring-boot-starter-freemarker

支持FreeMarker模板引擎。

 

16

spring-boot-starter-groovy-templates

支持Groovy模板引擎。

 

17

spring-boot-starter-hateoas

通过spring-hateoas支持基于HATEOAS的RESTful Web服务。

 

18

spring-boot-starter-hornetq


通过HornetQ支持JMS。


 

19

spring-boot-starter-integration

支持通用的spring-integration模块。

 

20

spring-boot-starter-jdbc


支持JDBC数据库。


 

21

spring-boot-starter-jersey

支持Jersey RESTful Web服务框架。

 

22

spring-boot-starter-jta-atomikos

通过Atomikos支持JTA分布式事务处理。

 

23

spring-boot-starter-jta-bitronix

通过Bitronix支持JTA分布式事务处理。

 

24

spring-boot-starter-mail


支持javax.mail模块。


 

25

spring-boot-starter-mobile

支持spring-mobile。

 

26

spring-boot-starter-mustache


支持Mustache模板引擎。


 

27

spring-boot-starter-redis

支持Redis键值存储数据库,包括spring-redis。

 

28

spring-boot-starter-security

支持spring-security。

 

29

spring-boot-starter-social-facebook

支持spring-social-facebook

 

30

spring-boot-starter-social-linkedin

支持pring-social-linkedin

 

31

spring-boot-starter-social-twitter

支持pring-social-twitter

 

32

spring-boot-starter-test

支持常规的测试依赖,包括JUnit、Hamcrest、Mockito以及spring-test模块。

 

33

spring-boot-starter-thymeleaf

支持Thymeleaf模板引擎,包括与Spring的集成。

 

34

spring-boot-starter-velocity

支持Velocity模板引擎。

 

35

spring-boot-starter-web

支持全栈式Web开发,包括Tomcat和spring-webmvc。

 

36

spring-boot-starter-websocket

支持WebSocket开发。

 

37

spring-boot-starter-ws

支持Spring Web Services。

 

 

应用启动器面向生产环境

 

 

1

spring-boot-starter-actuator


增加了面向产品上线相关的功能,比如测量和监控。


 

2

spring-boot-starter-remote-shell

增加了远程ssh shell的支持。

 

 

应用启动器还有一些替换技术的启动器

 

 

1

spring-boot-starter-jetty

引入了Jetty HTTP引擎(用于替换Tomcat)。

 

2

spring-boot-starter-log4j

支持Log4J日志框架。

 

3

spring-boot-starter-logging

引入了Spring Boot默认的日志框架Logback。

 

4

spring-boot-starter-tomcat

引入了Spring Boot默认的HTTP引擎Tomcat。

 

5

spring-boot-starter-undertow


引入了Undertow HTTP引擎(用于替换Tomcat)