在Spring Boot中建立本身的啓動器

寫在前面

也許你有一個內部庫包或一個在整個應用程序環境中經常使用的開源庫,若是要在多個Spring Boot應用程序中使用它,爲它建立一個Spring Boot啓動器可能會頗有用。spring

Spring Boot啓動器包含兩個模塊:bash

  1. 自動配置,這是執行繁重工做和設置模塊
  2. 啓動啓動程序模塊,它將您的lib庫包、@autoconfiguration和全部依賴項包裝在一個依賴項中

讓咱們看一下名爲@autoconfiguration的機制。這聽起來比實際更復雜。app

  1. 在啓動時,Spring Boot會掃描類路徑,查找 位於META-INF目錄中名爲spring.factories的全部文件,並對其進行處理。這些文件包含單個鍵org.springframework.boot.autoconfigure.EnableAutoConfiguration =,其值設置爲常規@Configurtion類的列表。
  2. 它會檢查每一個@Configurtion是否應該包含它並最終使用它。所謂使用就是加入Spring上下文,這樣能被別人發現,經過@autowired自動注入這些類。
  3. 當Spring Boot考慮使用它時,將添加條件; 就像@ConditionalOnClass同樣,它添加了一個條件,只有當類路徑中存在指定的@Configurtion類時纔會將這個類包含進來。

實現自動配置

Spring Boot建議爲模塊命名模式:-spring-boot-autoconfigure,還要聲明咱們應該爲全部屬性添加前綴,以避免弄亂任何名稱空間。讓咱們尊重它。spring-boot

好比這裏咱們的模塊將命名爲request-logging-spring-boot-autoconfigure,幷包含兩個類 - @ Confiration類和一個屬性類,用於公開可在application.properties中配置的一些屬性。工具

讓咱們從pom開始吧。ui

<?xml version="1.0"?>
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot</artifactId>
 <version>${spring-boot.version}</version>
</dependency>
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-autoconfigure</artifactId>
 <version>${spring-boot.version}</version>
</dependency>
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-configuration-processor</artifactId>
 <version>${spring-boot.version}</version>
 <optional>true</optional>
</dependency>
複製代碼

前兩個依賴項是使用Spring Boot和自動配置類,spring-boot-configuration-processor是一個從@ConfigurationProperties建立元數據文件的工具spa

下面是配置屬性類code

@ConfigurationProperties(prefix = "com.requestlogging")
public class RequestLoggingProperties {
 .....
}
複製代碼

下面一步定義RequestLoggingAutoConfiguration:咱們使用@EnableConfigurationProperties啓用屬性 並添加兩個條件:cdn

@ConditionalOnWebApplication表示只有Spring Boot應用程序是Web應用程序時才包含咱們的配置。
@ConditionalOnClass定義RequestContextLoggingFilter必須存在於類路徑才能包含配置它。
@Configuration
@ConditionalOnWebApplication
@ConditionalOnClass(RequestContextLoggingFilter.class)
@EnableConfigurationProperties(RequestLoggingProperties.class)
public class RequestLoggingAutoConfiguration {
 @Autowired
 private RequestLoggingProperties requestLoggingProperties;
 @Bean
 @Order(1)
 @ConditionalOnMissingBean
 public RequestContextLoggingFilter requestContextLoggingFilter() {
 return new RequestContextLoggingFilter(requestLoggingProperties.getRequestHeaderId(),
 requestLoggingProperties.getLogIdentifier());
 }
}
複製代碼

若是Spring Boot包含了咱們這個配置,那麼若是@ConditionalOnMissingBean有效,它將初始化咱們的過濾器bean:new一個RequestContextLoggingFilter實例 。只有當咱們的Spring上下文中沒有bean存在,咱們的bean纔會被初始化。xml

使用autoconfigure模塊, Spring建議爲啓動器命名模式:-spring-boot-starter. 這裏咱們命名爲request-logging-spring-boot-starter:

<dependency>
<groupId>com.jdon</groupId>
<artifactId>request-logging-spring-boot-autoconfigure</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
複製代碼

啓動器須要包含使此啓動器工做的全部活動依賴項,不然沒法工做。

這樣別人就能夠使用上面配置使用你的庫包了。

相關文章
相關標籤/搜索