建立屬於自己的 Spring Boot 自動配置

sc_ik發表於2019-01-19

介紹

這裡有官方提供的 演示專案介紹.

本筆記也是通過官方提供的演示專案來進行講解.

我們可以看到官方的專案中有三個模組, hornetq-sample-app hornetq-spring-boot-autoconfigurehornetq-spring-boot-starter.

其中 hornetq-sample-app 是演示如何使用自動配置, hornetq-spring-boot-autoconfigure 是自動配置時的一些邏輯處理, hornetq-spring-boot-starter 比較簡單其中只有一些專案的依賴; 比如我們使用的自動配置是針對哪個框架, 以及框架所需要的其它第三方框架都可以放入此工程.

當然可能有人會問到我是否可以將 hornetq-spring-boot-autoconfigurehornetq-spring-boot-starter 模組, 合併到一起? 當然你也可以這樣做, 但是我覺得分開的話會逼格高一些.

autoconfigure 模組重點

首先來看一下 pom 檔案, 在此檔案中有一個最主要的依賴.

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
</dependency>

這個依賴可牛逼了, 此依賴主要有我們要用到的註解和重要的 spring.factories 檔案. 當然了此依賴中還有一些其它框架的配置.

下面我們在說一下在自動配置時, 一些重要的註解.

在這個模組中最主要的兩個類 HornetQAutoConfigurationHornetQProperties. 我們在配置檔案中配置的屬性就會封裝成 HornetQProperties 物件. 那麼怎麼知道我們需要哪些配置呢? 當然是使用 @ConfigurationProperties("hornetq") 註解了, 其中 hornetq 是一個字首. 也可以使用 @Value 註解來幫我們賦值.

如:

hornetq.host="localhost"

hornetq:
    host: "localhost"

字首可以更詳細 spring.hornetq.host

接下來詳細說一下 HornetQAutoConfiguration 類中的註解.

@Configuration
@AutoConfigureBefore(JmsAutoConfiguration.class)
@ConditionalOnClass({ConnectionFactory.class, HornetQJMSClient.class})
@ConditionalOnMissingBean(ConnectionFactory.class)
@EnableConfigurationProperties(HornetQProperties.class)
public class HornetQAutoConfiguration {

從上往下一個一個來, @Configuration 註解表示一個配置類.

如果我們的自動配置需要等待某個物件配置完成, 這個時候可以使用 @AutoConfigureAfter@AutoConfigureBefore 註解, 表明在指定類之後之前配置.

也可以使用 @AutoconfigureOrder 註解, 這個註解類似於 @Order, 但是它是專門給 auto-configuration 使用.

我個人覺得 @ConditionalOnClass 註解非常重要, 註解主要在 classpath 目錄下存在時指定的類時, 才會解析當前配置類. 這也就是為啥我們不附加相應依賴的時候程式還可以執行的原因. 還有一個與此註解邏輯相反的註解 @ConditionalOnMissingClass 當不存在指定類的時候, 才會解析當前配置類.

@ConditionalOnMissingBean 通過例項的型別、類名、註解、暱稱去查詢是否存在對應的 Bean 如果存在, 則不回去解析. 還有一個與此註解邏輯相反的註解 @ConditionalOnBean 當存在指定 Bean 的時候才會去解析.

@EnableConfigurationProperties 註解是用來開啟對 @ConfigurationProperties 註解配置Bean的支援.

在本類下還有一個靜態內部類

@Configuration
@ConditionalOnClass(name = EMBEDDED_JMS_CLASS)
@ConditionalOnProperty(prefix = "hornetq.embedded", value = "enabled", havingValue = "true", matchIfMissing = true)
static class EmbeddedServerConfiguration {

@ConditionalOnProperty 註解能夠控制某個 configuration 是否生效. 具體操作是通過其兩個屬性 name 以及 havingValue 來實現的, 其中 name 用來從 application.properties 中讀取某個屬性值, 如果該值為空則返回false; 如果值不為空, 則將該值與 havingValue 指定的值進行比較, 如果一樣則返回 true; 否則返回 false. 如果返回值為false, 則該 configuration 不生效; 為 true 則生效.

value 屬性和 name 屬性一樣都是陣列, 但是不能和 name 屬性同時使用.

matchIfMissing 判斷當沒有找到 enabled 時, 是否繼續載入. 為 true 則繼續載入, 否則報錯.

最主要的其實還是 HornetQAutoConfiguration 類上的註解, 大家可以參考官方的專案來寫一個屬於自己的自動配置類.

spring.factories 檔案

在文章釋出後重新閱讀了一下文章, 發現忘了寫此檔案的作用.

spring.factories 檔案主要的作用就是讓 Spring Boot 來自動配置相關類.

org.springframework.boot.autoconfigure.EnableAutoConfiguration=hornetq.autoconfigure.HornetQAutoConfiguration

檔案路徑 src/main/resources/META-INF/spring.factories

相關文章