(第五講)自定義Spring Boot Starter

譚朝紅發表於2019-05-12

第四講中我們已經瞭解了Spring Boot自動配置的基本原理,瞭解其原理之後,你會覺得Spring Boot的自動配置能力其實也沒有那麼的神祕。在本講中,我們將嘗試實現一個自定義的Spring Boot Starter,以鞏固上一件中的內容。

1. 主要內容

  • 1.實現自定義的spring boot starter
  • 2.驗證自定義的spring boot starter是否生效
  • 3.驗證自動配置是否生效

本講所涉及的原始碼已經上傳到Github倉庫,你可以通過下面的連結獲取全部的原始碼:

github.com/ramostear/S…

2. 實現自定義的spring boot starter

現在,我們來實現這一一個功能,當SiteInformation類在classpath下的時候,系統自動配置SiteInformation類的Bean,並且SiteInformation類中的屬性可以在application.properties檔案中進行配置。

首先,使用IntelliJ IDEA建立一個Maven工程,在當前Project上選擇新建Module,在彈出皮膚中填寫相關資訊,如下圖所示:

(第五講)自定義Spring Boot Starter

點選下一步,選擇module存放路徑,如下圖所示:

(第五講)自定義Spring Boot Starter

點選完成按鈕,生成新的Module,然後修改module中的pom.xml,新增spring-boot-autoconfigure依賴,完整的配置程式碼如下所示:

(第五講)自定義Spring Boot Starter

新增spring-boot-autoconfigure依賴的目的是讓自定義的starter具有自動配置的能力

然後,建立一個名為:com.ramostear.spring.boot.starter.site的包,並在包下建立SiteInformation.java檔案,這個類提供了站點的一些基本屬性,原始碼如下:

(第五講)自定義Spring Boot Starter

@ConfigurationProperties(prefix = "site")註解的作用是當我們需要覆蓋站點資訊時,在application.properties檔案中需要使用“site”作為屬性的字首,如site.name = ramostear。如果不做任何配置,站點資訊將使用預設值:unknown

接下來,建立一個SiteInformationProvider.java檔案,用於返回站點資訊,其原始碼如下所示:

(第五講)自定義Spring Boot Starter

SiteInformationProvider.java是自動配置的依據類,當引用此自定義Starter時,會依據SiteInformationProvider是否存在類建立這個類的Bean。

準備好上述兩個類之後,需要建立一個自動配置類,如SiteInformationAutoConfiguration.java,其原始碼如下所示:

(第五講)自定義Spring Boot Starter

@ConditionalOnWebApplication註解表名此自動配置可以在Web應用中進行使用,@EnableConfigurationProperties(SiteInformation.class)註解指明提供自動配置的屬性物件@ConditionalOnMissingBean(SiteInformationProvider.class)指明當容器中沒有SiteInformationProvider這個類的Bean時,自動配置這個類的Bean

最後,需要將此配置類進行註冊,Spring Boot才能完成自動配置工作。在resources資原始檔夾下建立名為META-INF的資料夾,並新增名為spring.factories的檔案,修改其內容為:

(第五講)自定義Spring Boot Starter

若有多個自動配置項,請用“,”進行分割,此處的“\”是為了換行後任然能夠讀取到屬性。

完成上述的所有工作後,點選IDEA右側Maven工具欄,選擇當前專案,找到Plugins中的install選項並點選執行安裝,如下圖所示:

(第五講)自定義Spring Boot Starter

上述操作執行成功後,你可以在控制檯看到如下所示的提示資訊:

(第五講)自定義Spring Boot Starter

提示,請使用maven自帶的外掛對專案進行打包和安裝,切勿使用spring-boot-maven-plugin進行打包安裝,否則打包後的jar無法使用,請將下面的程式碼從你的pom檔案中剔除:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
複製程式碼

至此,自定義的spring boot starter製作完成。接下來建立一個web工程,引入spring-boot-starter-site,測試此starter是否能夠正常使用。

3. 建立Web工程

新建一個測試用的Module,並使用IDEA自帶的Spring Initializr建立一個Web工程,如下圖所示:

(第五講)自定義Spring Boot Starter

選擇Module SDK的版本,選擇下一步,填寫Module相關資訊,如下圖所示:

(第五講)自定義Spring Boot Starter

然後點選下一步,將Web依賴新增到專案中,然後點選儲存按鈕,生成新的Module。如下如所示:

(第五講)自定義Spring Boot Starter

接下來,將spring-boot-starter-site依賴新增到測試用的Web工程中,pom.xml原始碼如下:

(第五講)自定義Spring Boot Starter

4. 驗證自定義Starter

修改CustomStarterTestApplication.java中的原始碼,新增@RestController註解,並建立一個獲取站點資訊的方法,原始碼如下:

(第五講)自定義Spring Boot Starter

接下來在application.properties檔案中新增如下的類容:

site.name = 譚朝紅的技術分享部落格
site.domain = www.ramostear.com
site.keywords = blog
site.description = 譚朝紅的技術分享部落格
site.copyright = Copyright 2019-Ramostear

logging.level.org.springframework = debug
複製程式碼

配置logging.level.org.springframework= debug屬性的作用是能夠在控制檯日誌中檢視自定義的starter是否生效。

5. 執行並測試

點選執行CustomStarterTestApplication主類,並觀察控制檯輸出,當自定義的starter生效後,你可以在控制檯看到如下的資訊:

============================
CONDITIONS EVALUATION REPORT
============================


Positive matches:
-----------------
...
   SiteInformationAutoConfiguration matched:
      - @ConditionalOnWebApplication (required) found 'session' scope (OnWebApplicationCondition)

   SiteInformationAutoConfiguration#provider matched:
      - @ConditionalOnMissingBean (types: com.ramostear.spring.boot.starter.site.SiteInformationProvider; SearchStrategy: all) did not find any beans (OnBeanCondition)
...
複製程式碼

最後,使用Postman工具請求http://localhost:8080/site/info 並觀察返回的資訊:

(第五講)自定義Spring Boot Starter

請求成功、並返回了站點的配置資訊,詳細資訊如下所示:

{
  "name": "譚朝紅的技術分享部落格",
  "domain": "www.ramostear.com",
  "copyright": "Copyright 2019-Ramostear",
  "keywords": "blog",
  "description": "譚朝紅的技術分享部落格"
}
複製程式碼

6. 總結

本小節演示瞭如何建立一個自定義的Spring Boot Starter,並進行測試。進一步加深和強化了對Spring Boot自動配置原理的理解。本次分享類容到此結束,謝謝~~

作者:譚朝紅 原文:www.ramostear.com/articles/cu…

相關文章