spi概念
我們系統裏抽象的各個模塊,往往有很多不同的實現方案,比如日誌模塊的方案,xml解析模塊、jdbc模塊的方案等。面向的對象的設計裏,我們一般推薦模塊之間基於接口編程,模塊之間不對實現類進行硬編碼。一旦代碼裏涉及具體的實現類,就違反了可拔插的原則,如果需要替換一種實現,就需要修改代碼。
爲了實現在模塊裝配的時候能不在程序裏動態指明,這就需要一種服務發現機制。java spi就是提供這樣的一個機制:爲某個接口尋找服務實現的機制。有點類似IOC的思想,就是將裝配的控制權移到程序之外,在模塊化設計中這個機制尤其重要。
關鍵點,實現(impl)熱插拔
spi機制的約定:
- 在META-INF/services/目錄中創建以接口全限定名命名的文件該文件內容爲Api具體實現類的全限定名
- 使用ServiceLoader類動態加載META-INF中的實現類
- 如SPI的實現類爲Jar則需要放在主程序classPath中
- Api具體實現類必須有一個不帶參數的構造方法