對于自動裝配原理進行分析之後,我們可以基于這樣一個機制來實作一個自己的Starter元件,這樣會更加深入的了解Spring Boot的Starter的存在以及如何更好的使用這些Starter。
對于Spring Boot提供的很多的元件并不是包括了所有的技術元件,在實際開發中還是有很多的元件需要自己去進行Spring Boot Starter的封裝操作。而這些Starter不外乎就是實作了如下的三個功能
- 引入相關場景依賴的Jar包進行管理
- 自動對該場景下使用的JavaBean進行注入和配置
- 聲明或者加載配置檔案中的配置并且提供自定義配置的入口
下面我們就通過一個簡單的例子來完成對于如何封裝一個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檔案,并且仿照它的樣子來編寫我們自己的注入内容,如下圖所示。
最終我們使用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相關的内容。