在 第四講中咱們已經瞭解了Spring Boot自動配置的基本原理,瞭解其原理以後,你會以爲Spring Boot的自動配置能力其實也沒有那麼的神祕。在本講中,咱們將嘗試實現一個自定義的Spring Boot Starter,以鞏固上一件中的內容。
本講所涉及的源碼已經上傳到Github倉庫,你能夠經過下面的連接獲取所有的源碼:https://github.com/ramostear/Spring_Boot_2.X_Tutorial/tree/master/spring-boot-starter-sitehtml
如今,咱們來實現這一一個功能,當SiteInformation類在classpath下的時候,系統自動配置SiteInformation類的Bean,而且SiteInformation類中的屬性能夠在application.properties文件中進行配置。java
首先,使用IntelliJ IDEA建立一個Maven工程,在當前Project上選擇新建Module,在彈出面板中填寫相關信息,以下圖所示:git
點擊下一步,選擇module存放路徑,以下圖所示:github
點擊完成按鈕,生成新的Module,而後修改module中的pom.xml,添加spring-boot-autoconfigure依賴,完整的配置代碼以下所示:web
添加spring-boot-autoconfigure依賴的目的是讓自定義的starter具備自動配置的能力
而後,建立一個名爲:com.ramostear.spring.boot.starter.site的包,並在包下建立SiteInformation.java文件,這個類提供了站點的一些基本屬性,源碼以下:spring
@ConfigurationProperties(prefix = "site")註解的做用是當咱們須要覆蓋站點信息時,在application.properties文件中須要使用「site」做爲屬性的前綴,如site.name = ramostear。若是不作任何配置,站點信息將使用默認值:unknown
接下來,建立一個SiteInformationProvider.java文件,用於返回站點信息,其源碼以下所示:json
SiteInformationProvider.java是自動配置的依據類,當引用此自定義Starter時,會依據SiteInformationProvider是否存在類建立這個類的Bean。
準備好上述兩個類以後,須要建立一個自動配置類,如SiteInformationAutoConfiguration.java,其源碼以下所示:session
@ConditionalOnWebApplication註解表名此自動配置能夠在Web應用中進行使用,@EnableConfigurationProperties(SiteInformation.class)註解指明提供自動配置的屬性對象@ConditionalOnMissingBean(SiteInformationProvider.class)指明當容器中沒有SiteInformationProvider這個類的Bean時,自動配置這個類的Bean
最後,須要將此配置類進行註冊,Spring Boot才能完成自動配置工做。在resources資源文件夾下建立名爲META-INF的文件夾,並添加名爲spring.factories的文件,修改其內容爲:app
如有多個自動配置項,請用「,」進行分割,此處的「」是爲了換行後任然可以讀取到屬性。
完成上述的全部工做後,點擊IDEA右側Maven工具欄,選擇當前項目,找到Plugins中的install選項並點擊執行安裝,以下圖所示:dom
上述操做運行成功後,你能夠在控制檯看到以下所示的提示信息:
提示,請使用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是否可以正常使用。
新建一個測試用的Module,並使用IDEA自帶的Spring Initializr建立一個Web工程,以下圖所示:
選擇Module SDK的版本,選擇下一步,填寫Module相關信息,以下圖所示:
而後點擊下一步,將Web依賴添加到項目中,而後點擊保存按鈕,生成新的Module。以下如所示:
接下來,將spring-boot-starter-site依賴添加到測試用的Web工程中,pom.xml源碼以下:
修改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是否生效。
點擊運行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": "譚朝紅的技術分享博客" }
本小節演示瞭如何建立一個自定義的Spring Boot Starter,並進行測試。進一步加深和強化了對Spring Boot自動配置原理的理解。本次分享類容到此結束,謝謝~~
做者:譚朝紅
原文: https://www.ramostear.com/art... 來源:譚朝紅的技術分享博客