springboot2-自定義一個starter

創建一個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包含如下內容:

  1. 一個自動配置模塊兒,包含自動配置代碼;
  2. 一個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,它僅僅提供一些必要的依賴。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章