介紹
本筆記也是通過官方提供的演示專案來進行講解.
我們可以看到官方的專案中有三個模組, hornetq-sample-app
hornetq-spring-boot-autoconfigure
和 hornetq-spring-boot-starter
.
其中 hornetq-sample-app
是演示如何使用自動配置, hornetq-spring-boot-autoconfigure
是自動配置時的一些邏輯處理, hornetq-spring-boot-starter
比較簡單其中只有一些專案的依賴; 比如我們使用的自動配置是針對哪個框架, 以及框架所需要的其它第三方框架都可以放入此工程.
當然可能有人會問到我是否可以將 hornetq-spring-boot-autoconfigure
和 hornetq-spring-boot-starter
模組, 合併到一起? 當然你也可以這樣做, 但是我覺得分開的話會逼格高一些.
autoconfigure 模組重點
首先來看一下 pom
檔案, 在此檔案中有一個最主要的依賴.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
這個依賴可牛逼了, 此依賴主要有我們要用到的註解和重要的 spring.factories
檔案. 當然了此依賴中還有一些其它框架的配置.
下面我們在說一下在自動配置時, 一些重要的註解.
在這個模組中最主要的兩個類 HornetQAutoConfiguration
和 HornetQProperties
. 我們在配置檔案中配置的屬性就會封裝成 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