在第四講中我們已經瞭解了Spring Boot自動配置的基本原理,瞭解其原理之後,你會覺得Spring Boot的自動配置能力其實也沒有那麼的神祕。在本講中,我們將嘗試實現一個自定義的Spring Boot Starter,以鞏固上一件中的內容。
1. 主要內容
- 1.實現自定義的spring boot starter
- 2.驗證自定義的spring boot starter是否生效
- 3.驗證自動配置是否生效
本講所涉及的原始碼已經上傳到Github倉庫,你可以通過下面的連結獲取全部的原始碼:
2. 實現自定義的spring boot starter
現在,我們來實現這一一個功能,當SiteInformation類在classpath下的時候,系統自動配置SiteInformation類的Bean,並且SiteInformation類中的屬性可以在application.properties檔案中進行配置。
首先,使用IntelliJ IDEA建立一個Maven工程,在當前Project上選擇新建Module,在彈出皮膚中填寫相關資訊,如下圖所示:
點選下一步,選擇module存放路徑,如下圖所示:
點選完成按鈕,生成新的Module,然後修改module中的pom.xml,新增spring-boot-autoconfigure依賴,完整的配置程式碼如下所示:
新增spring-boot-autoconfigure依賴的目的是讓自定義的starter具有自動配置的能力
然後,建立一個名為:com.ramostear.spring.boot.starter.site的包,並在包下建立SiteInformation.java檔案,這個類提供了站點的一些基本屬性,原始碼如下:
@ConfigurationProperties(prefix = "site")註解的作用是當我們需要覆蓋站點資訊時,在application.properties檔案中需要使用“site”作為屬性的字首,如site.name = ramostear。如果不做任何配置,站點資訊將使用預設值:unknown
接下來,建立一個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…