(第五講)自定義Spring Boot Starter

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

1. 主要內容

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

本講所涉及的源碼已經上傳到Github倉庫,你能夠經過下面的連接獲取所有的源碼:java

github.com/ramostear/S…git

2. 實現自定義的spring boot starter

如今,咱們來實現這一一個功能,當SiteInformation類在classpath下的時候,系統自動配置SiteInformation類的Bean,而且SiteInformation類中的屬性能夠在application.properties文件中進行配置。github

首先,使用IntelliJ IDEA建立一個Maven工程,在當前Project上選擇新建Module,在彈出面板中填寫相關信息,以下圖所示:web

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

點擊完成按鈕,生成新的Module,而後修改module中的pom.xml,添加spring-boot-autoconfigure依賴,完整的配置代碼以下所示:json

添加spring-boot-autoconfigure依賴的目的是讓自定義的starter具備自動配置的能力markdown

而後,建立一個名爲:com.ramostear.spring.boot.starter.site的包,並在包下建立SiteInformation.java文件,這個類提供了站點的一些基本屬性,源碼以下:session

@ConfigurationProperties(prefix = "site")註解的做用是當咱們須要覆蓋站點信息時,在application.properties文件中須要使用「site」做爲屬性的前綴,如site.name = ramostear。若是不作任何配置,站點信息將使用默認值:unknownapp

接下來,建立一個SiteInformationProvider.java文件,用於返回站點信息,其源碼以下所示:

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

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

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

最後,須要將此配置類進行註冊,Spring Boot才能完成自動配置工做。在resources資源文件夾下建立名爲META-INF的文件夾,並添加名爲spring.factories的文件,修改其內容爲:

如有多個自動配置項,請用「,」進行分割,此處的「\」是爲了換行後任然可以讀取到屬性。

完成上述的全部工做後,點擊IDEA右側Maven工具欄,選擇當前項目,找到Plugins中的install選項並點擊執行安裝,以下圖所示:

上述操做運行成功後,你能夠在控制檯看到以下所示的提示信息:

提示,請使用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工程,以下圖所示:

選擇Module SDK的版本,選擇下一步,填寫Module相關信息,以下圖所示:

而後點擊下一步,將Web依賴添加到項目中,而後點擊保存按鈕,生成新的Module。以下如所示:

接下來,將spring-boot-starter-site依賴添加到測試用的Web工程中,pom.xml源碼以下:

4. 驗證自定義Starter

修改CustomStarterTestApplication.java中的源碼,添加@RestController註解,並建立一個獲取站點信息的方法,源碼以下:

接下來在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 並觀察返回的信息:

請求成功、並返回了站點的配置信息,詳細信息以下所示:

{
  "name": "譚朝紅的技術分享博客",
  "domain": "www.ramostear.com",
  "copyright": "Copyright 2019-Ramostear",
  "keywords": "blog",
  "description": "譚朝紅的技術分享博客"
}
複製代碼

6. 總結

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

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

相關文章
相關標籤/搜索