創建一個auto-configuration
理解 auto-configuration
auto-configuration
實際也是通過標準的**@Configuration
** 類實現的,同時通過 @Conditional
註解來控制何時啓用,通常會使用 @ConditionalOnClass
和 @ConditionalOnMissingBean
註解,這樣能確保發現關鍵的類存在時並且你沒有定義自己相關的@Configuration
時啓用自動配置。
查找自動配置的類
springboot 會檢查發佈的jar包中是否含有 META-INF/spring.factories文件,並且該文件應該在 EnableAutoConfiguration
下列出自定義的配置類:
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
說明:自動配置必須以這種形式加載,確保可以在特定的包下定義配置類,並且絕不讓他們作爲組件掃描的目標。自動配置的類也不應該啓用組件掃描查找其他的組件。
如果你定義的配置類需要應用在特定的順序可以使用 @AutoConfigureAfter
和@AutoConfigureBefore
註解。
@Conditional 註解
自動配置類上通常會包含一個或者多個 @Conditional 註解,包含如下註解:
@ConditionalOnClass、@ConditionalOnMissingClass
@Configuration
// Some conditions
public class MyAutoConfiguration {
// Auto-configured beans
@Configuration
@ConditionalOnClass(EmbeddedAcmeService.class)
static class EmbeddedConfiguration {
@Bean
@ConditionalOnMissingBean
public EmbeddedAcmeService embeddedAcmeService() { ... }
}
}
@ConditionalOnBean、@ConditionalOnMissingBean
@Configuration
public class MyAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public MyService myService() { ... }
}
說明:以上標識myService bean將被創建,如果ApplicationContext中沒有發現MyService類型的bean時;
@ConditionalOnProperty
- @ConditionalOnProperty基於spring環境的屬性配置決定配置類是否該被包含;
ConditionalOnResource
- 如果某個特定的資源存在 決定是否包含此配置類
@ConditionalOnWebApplication、@ConditionalOnNotWebApplication
- 看是否是 web aplication決定是否包含此配置類
@ConditionalOnExpression
- 依賴SpEL表達式的結果決定是否包含此配置類
創建一個starter
整體原則:
一個完整的springboot starter包含如下內容:
- 一個自動配置模塊兒,包含自動配置代碼;
- 一個starter模塊兒,提供了自動配置模塊兒的依賴和一些他所依賴的其他的外部依賴;
總而言之,一個starter應該提供能使他啓用的所依賴的所有東西。如果不想講兩者分開也可以將 ````auto-configuration code and the dependency management ```包含在一個模塊兒裏。
具體要求
1. name
應該爲你的starter起一個合適的名字,不要以spring-boot開頭,甚至用一個不同的groupId。
2. 自動配置模塊兒
自動配置模塊兒包含了starter啓用所依賴的一切,包含配置屬性的定義例如:ConfigurationProperties,還有一些回調接口用於自定義組件的啓動形式。
同時官方建議標記自動配置模塊兒的依賴爲可選擇的,以便於在項目裏友好的引用此自動配置模塊兒。
springboot使用一個註解處理器從一個元文件中收集自動配置類啓用的條件(META-INF/spring-autoconfigure-metadata.properties
),如果提供這個文件將提高啓動時間,官方建議增加如下的依賴在自動配置模塊兒;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure-processor</artifactId>
<optional>true</optional>
</dependency>
3. starter模塊兒
starter模塊兒實際上是一個空jar,它僅僅提供一些必要的依賴。