天天看點

Spring Boot 進階-SpringBoot手寫一個Starter

作者:架構師面試寶典
Spring Boot 進階-SpringBoot手寫一個Starter

對于自動裝配原理進行分析之後,我們可以基于這樣一個機制來實作一個自己的Starter元件,這樣會更加深入的了解Spring Boot的Starter的存在以及如何更好的使用這些Starter。

對于Spring Boot提供的很多的元件并不是包括了所有的技術元件,在實際開發中還是有很多的元件需要自己去進行Spring Boot Starter的封裝操作。而這些Starter不外乎就是實作了如下的三個功能

  1. 引入相關場景依賴的Jar包進行管理
  2. 自動對該場景下使用的JavaBean進行注入和配置
  3. 聲明或者加載配置檔案中的配置并且提供自定義配置的入口

下面我們就通過一個簡單的例子來完成對于如何封裝一個Starter的了解。

Starter如何進行命名

首先需要說明的是,這裡對于Starter的命名規則并沒有明确的要求必須怎麼樣去命名,這裡推薦的隻是一種大衆化的命名方式,也就是一種約定的命名方式。這裡我們推薦模仿官方的命名方式,例如

  • web場景下的啟動器:spring-boot-starter-web
  • jdbc場景下的啟動器:spring-boot-starter-jdbc

當然還有很多的啟動器命名是由第三方提供的,是以他們的命名方式也有自己的特點例如

  • MyBatis場景啟動器:mybatis-spring-boot-starter
  • Druid場景啟動器:druid-spring-boot-starter

實作一個緩存相關的場景啟動器

我們都知道在SpringBoot中提供了一個Redis相關的場景啟動器spring-boot-starter-data-redis ,并且通過RedisTemplate來實作對于Redis的裝配操作。但是現在又出現了一種Redisson的用戶端并且提供了比RedisTemplate更加高效的用戶端支援是以這裡我們通過實作Redisson的啟動起來學習如何開發一個場景啟動器。

首先我們需要來建立一個redisson-spring-boot-starter的Maven項目。并且在對應的POM檔案中引入如下的依賴。

<dependency>
  <groupId>org.redisson</groupId>
  <artifactId>redisson</artifactId>
	<version>${redisson.version}</version>
</dependency>           

在之前的例子中,我們學習了關于配置類的編寫方式,這裡我們來編寫對應的配置類,以及設定配置類屬性。

@ConfigurationProperties(prefix = "nh.redisson")
@Data
public class RedissonProperties {
    private String host = "localhost";
    private Integer port = 6379;
    private String password;
    private Integer timeout;
    private boolean ssl;
}
           

當然在這個配置類中我們還可以指定更多的配置,這裡我們先通過幾個小的屬性來進行一個簡單的說明。

定義完配置類之後,我們就需要配置自動配置類了。根據之前我們學習過的規則,來建立一個RedissonAutoConfiguration的自動配置類,并且将相關的配置項以及配置檔案進行綁定。

@Configuration
@ConditionalOnClass(Redisson.class)
@EnableConfigurationProperties(RedissonProperties.class)
public class RedissonAutoConfiguration {
    
    @Bean
    public RedissonClient redisClient(RedissonProperties redissonProperties){
        Config config = new Config();
        String  prefix = "redis://";
        if (redissonProperties.isSsl()){
            prefix = "redis://";
        }
        SingleServerConfig singleServerConfig = config.useSingleServer()
                .setAddress(prefix+redissonProperties.getHost()+":"+redissonProperties.getPort())
                .setConnectTimeout(redissonProperties.getTimeout());
        if (!StringUtils.isEmpty(redissonProperties.getPassword())){
            singleServerConfig.setPassword(redissonProperties.getPassword());
        }
        return Redisson.create(config);
    }
}           

最後一步也是最重要的一步,我們知道在Spring Boot 啟動的時候加載自動配置檔案的時候,都是通過在META-INF/spring.factories檔案進行加載的,那麼既然是自定義的Starter我們也需要在resource下建立META-INF/spring.factories檔案,并且仿照它的樣子來編寫我們自己的注入内容,如下圖所示。

Spring Boot 進階-SpringBoot手寫一個Starter

最終我們使用deploy工具将我們自定義的Starter打包到本地倉庫中。通過如下的方式就可以引入到其他項目中并使用

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

接下來就是在application.yml配置檔案中添加如下的配置

nh:
  host: localhost
  port: 6379           

總結

到這裡,我們的一個基于Redisson的緩存場景啟動器就已經開發完成了。雖然實作的功能較為簡單,但是其中卻包含着如何了解Spring Boot啟動原理相關的很多知識點,如果感興趣的讀者可以關注部落客,閱讀之前合集中的文章來掌握相關的知識,以便于大家能更好的了解Starter相關的内容。

繼續閱讀