Spring Boot起步依賴:定制starter


在定制我們自己的起步依賴——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-autoconfigurejedis-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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM