Spring.factories擴展機制


和Java SPI的擴展機制類似,Spring Boot采用了spring.factories的擴展機制,在很多spring的starter 包中都可以找到,通過在 META-INF/spring.factories文件中指定自動配置類入口,從而讓框架加載該類實現jar的動態加載。

這種為某個接口尋找服務實現的機制,有點類似IOC的思想,就是將裝配的控制權移到程序之外,在模塊化設計中這個機制尤其重要。

 

我們系統里抽象的各個模塊,往往有很多不同的實現方案,比如日志模塊的方案,xml解析模塊、jdbc模塊的方案等。面向的對象的設計里,我們一般推薦模塊之間基於接口編程,模塊之間不對實現類進行硬編碼。一旦代碼里涉及具體的實現類,就違反了可拔插的原則,如果需要替換一種實現,就需要修改代碼。為了實現在模塊裝配的時候能不在程序里動態指明,這就需要一種服務發現機制。 

Spring Boot中在META-INF/spring.factories文件中配置接口的實現類名稱,然后在程序中讀取這些配置文件並實例化。 這種自定義的SPI機制是Spring Boot Starter實現的基礎。 
Spring Factories實現原理是什么
spring-core包里定義了SpringFactoriesLoader類,這個類實現了檢索META-INF/spring.factories文件,並獲取指定接口的配置的功能。在這個類中定義了兩個對外的方法:
loadFactories 根據接口類獲取其實現類的實例,這個方法返回的是對象列表。 
loadFactoryNames 根據接口獲取其接口類的名稱,這個方法返回的是類名的列表。 
上面的兩個方法的關鍵都是從指定的ClassLoader中獲取spring.factories文件,並解析得到類名列表,遍歷整個ClassLoader中所有jar包下的spring.factories文件。也就是說我們可以在自己的jar中配置spring.factories文件,不會影響到其它地方的配置,也不會被別人的配置覆蓋。
spring.factories的是通過Properties解析得到的,所以我們在寫文件中的內容都是安裝下面這種方式配置的:
com.xxx.interface=com.xxx.classname

如果一個接口希望配置多個實現類,可以使用’,’進行分割。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM