受不了springboot的yml和properties配置,我擴展出了groovy配置

文中代碼地址:https://github.com/gaohanghbut/groovy-configuration

起因

Springboot支持yml和properties兩種方式的配置,不知道有沒有同學和我一樣,對yml, properties, xml這類配置非常不喜歡,配置太多了之後,可讀性急劇下降,維護配置非常困難,估計只有java這樣的編程語言的框架使用大量的xml, properties等作為配置文件了

但是Java支持groovy腳本,我們可以利用groovy來取代yml和properties,使用application.groovy替代application.yml或application.propertie,使用application-xxx.groovy替代application-xxx.yml或application-xxx.properties,並且支持groovy語法,配置類似如下圖,對於groovy類中類型為String或者GString的屬性都會被認為是一個property,對於類型為Map的屬性,會認為是property的集合,基於這個特性,我們可以將同一類型的配置用同一個Map表示,極大的增加了可讀性,降低了維護成本:

受不了springboot的yml和properties配置,我擴展出了groovy配置

如果只需要用一個Map表示所有的配置,則可以不定義類,只定義一個Map:

受不了springboot的yml和properties配置,我擴展出了groovy配置

在工程的resources目錄下,通過application.groovy或者application-xxx.groovy表示配置:

受不了springboot的yml和properties配置,我擴展出了groovy配置

可支持profile,本文中的例子是一個簡化的配置,實際中的配置要複雜得多,在實際應用中,可將application.groovy與application.properties或者application.yml共存。

應用的啟動類不變,還是原來的樣子:

受不了springboot的yml和properties配置,我擴展出了groovy配置

關於實現方式,我們先從springboot的擴展開始

SpringBoot的擴展

這裡不從頭講述springboot的擴展,這不是文章的重點,我們直接進入到一個類PropertySourcesLoader,其中初始化相關代碼:

受不了springboot的yml和properties配置,我擴展出了groovy配置

可以看到,這裡通過SpringFactoriesLoader獲取了PropertySourceLoader接口的實例,那麼SpringFactoriesLoader是幹嘛的?它就是用來加載spring的jar包中的spring.factories文件的,源碼如下:

受不了springboot的yml和properties配置,我擴展出了groovy配置

受不了springboot的yml和properties配置,我擴展出了groovy配置

咱們再來看看PropertySourceLoader有哪些實現:

受不了springboot的yml和properties配置,我擴展出了groovy配置

可以看到,springboot提供了properties和yml兩種實現,咱們再看看PropertySourcesLoader中加載配置的代碼:

受不了springboot的yml和properties配置,我擴展出了groovy配置

通過這個方法我們可以看到,springboot分別用了不同的PropertySourceLoader加載不同格式的配置

實現對groovy配置的支持

咱們先看看PropertySourceLoader接口的定義:

受不了springboot的yml和properties配置,我擴展出了groovy配置

它只有兩個方法:

· getFileExtensions:用於獲取支持的配置文件的後綴

· load:用於加載配置,得到PropertySource

講到這裡,大家應該就明白了,想要支持groovy,分兩步即可:

1. 實現一個PropertySourceLoader,用於加載groovy文件並得到PropertySource

2. 創建META-INF/spring.factories並將實現的PropertySourceLoader配置在此文件中

咱們來看代碼,先是對PropertySourceLoader的實現:


受不了springboot的yml和properties配置,我擴展出了groovy配置

 

有了這個GroovyPropertySourceLoader後,我們再創建spring.factories:
受不了springboot的yml和properties配置,我擴展出了groovy配置


其中的內容:
org.springframework.boot.env.PropertySourceLoader=\\cn.yxffcode.springboot.configuration.groovy.GroovyPropertySourceLoader
最後,GroovyPropertySourceLoader中使用到的Reflections類:
受不了springboot的yml和properties配置,我擴展出了groovy配置



分享到:


相關文章: