java中的SPI機制

spi概念

我們系統裏抽象的各個模塊,往往有很多不同的實現方案,比如日誌模塊的方案,xml解析模塊、jdbc模塊的方案等。面向的對象的設計裏,我們一般推薦模塊之間基於接口編程,模塊之間不對實現類進行硬編碼。一旦代碼裏涉及具體的實現類,就違反了可拔插的原則,如果需要替換一種實現,就需要修改代碼。

爲了實現在模塊裝配的時候能不在程序裏動態指明,這就需要一種服務發現機制。java spi就是提供這樣的一個機制:爲某個接口尋找服務實現的機制。有點類似IOC的思想,就是將裝配的控制權移到程序之外,在模塊化設計中這個機制尤其重要。

關鍵點,實現(impl)熱插拔

spi機制的約定:

  • 在META-INF/services/目錄中創建以接口全限定名命名的文件該文件內容爲Api具體實現類的全限定名
  • 使用ServiceLoader類動態加載META-INF中的實現類
  • 如SPI的實現類爲Jar則需要放在主程序classPath中
  • Api具體實現類必須有一個不帶參數的構造方法

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章