在定制我們自己的起步依賴——xxx.spring.boot.starter之前,我們先了解下什么是Spring Boot起步依賴。
起步依賴,是Spring Boot帶給我們的一項重要的便利。要理解Spring Boot起步依賴帶來的好處,先讓我們假設它不存在。如果沒用Spring Boot的話,你會向項目里添加哪些依賴呢?要用Spring MVC的話,你需要哪個Spring依賴?你還記得Thymeleaf的Group和Artifact ID嗎?你應該用哪個版本的Spring Data JPA呢?它們放在一起兼容嗎?
總之,如果沒有Spring Boot起步依賴的話,你就需要自己管理項目依賴關系。Spring Boot通過提供眾多起步依賴降低項目依賴的復雜度。起步依賴本質上是一個Maven項目對象模型(Project Object Model,POM),定義了對其他庫的傳遞依賴,這些東西加在一起即支持某項功能。
創建自己的起步依賴Starter
一個完整的Spring Boot 起步依賴一般包括兩部分:
- autoconfigure 模塊,包含着自動配置的代碼
- starter 模塊,包含 autoconfigure 模塊的依賴以及其它有用的依賴。
命名規則
為起步依賴提供一個恰當的命名空間是一個好的習慣。通常我們的習慣是xxx-spring-boot-autoconfigure,假設要為了jedis創建一個起步依賴,那么一個比較好的命名方式是jedis-spring-boot-autoconfigure和jedis-spring-boot-starter。
autoconfigure模塊
起步依賴的大部分內容都在autoconfigure模塊,通常包括:
一個被 @ConfigurationProperties 注解的屬性定義類。如:
@Component
@ConfigurationProperties(prefix="spring.jedis")
public class JedisProperties {
private String host;
private int port;
private int maxTotal=10;
private int maxIdle=5;
private int minIdle=5;
private boolean testOnBorrow=false;
private boolean testOnReturn=false;
private int timeout;
// getter and setter
...
}
一個用於實現自動配置的AutoConfigure類。例如:
@Configuration
@ConditionalOnClass({ JedisPool.class, Jedis.class, JedisPoolConfig.class})
@EnableConfigurationProperties({JedisProperties.class})
@AutoConfigureAfter({JedisProperties.class})
public class JedisAutoConfigure {
@Autowired
private JedisProperties jedisProperties;
@PostConstruct
public void checkConfigFileExists()
{
}
@Bean
@ConfigurationProperties(prefix = "spring.jedis")
public JedisPoolConfig jedisPoolConfig(){
return new JedisPoolConfig();
}
@Bean
@ConditionalOnMissingBean
public JedisPool jedisPool(JedisPoolConfig jedisPoolConfig){
return new JedisPool(jedisPoolConfig,
jedisProperties.getHost(),
jedisProperties.getPort(),
jedisProperties.getTimeout());
}
}
一個指定AutoConfigure類路徑的文件 META-INF/spring.factories :
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
fun.example.spring.boot.autoconfigure.JedisAutoConfigure
這個三個文件差不多就是autoconfigure模塊的全部了。
除此之外,還可以配置META-INF/spring-autoconfigure-metadata.properties元數據文件,這個文件可以提高應用的啟動速度。官方原文如下:
Spring Boot uses an annotation processor to collect the conditions on auto-configurations in a metadata file (META-INF/spring-autoconfigure-metadata.properties). If that file is present, it is used to eagerly filter auto-configurations that do not match, which will improve startup time. It is recommended to add the following dependency in a module that contains auto-configurations:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
starter 模塊
starter 模塊完完全全是空的,唯一的目的就是提供必需的依賴。它也許長成這樣:
<?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">
<parent>
<artifactId>jedis-spring-boot</artifactId>
<groupId>fun.example.spring.boot</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jedis-spring-boot-autoconfigure</artifactId>
<name>jedis-spring-boot-autoconfigure</name>
<properties>
<jedis.version>2.8.2</jedis.version>
</properties>
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis.version}</version>
</dependency>
</dependencies>
</project>
整個項目的配置模板可以看這里:spring-boot-demo。