java中的SPI機(jī)制模仿Logger日志框架實(shí)現(xiàn)

Why:為什么需要SPI?

我們系統(tǒng)里抽象的各個模塊,往往有很多不同的實(shí)現(xiàn)方案,比如日志模塊的方案,xml解析模塊、jdbc模塊的方案等。面向的對象的設(shè)計(jì)里,我們一般推薦模塊之間基于接口編程,模塊之間不對實(shí)現(xiàn)類進(jìn)行硬編碼。一旦代碼里涉及具體的實(shí)現(xiàn)類,就違反了可拔插的原則,如果需要替換一種實(shí)現(xiàn),就需要修改代碼。為了實(shí)現(xiàn)在模塊裝配的時候能不在程序里動態(tài)指明(在類路徑下去找...),這就需要一種服務(wù)發(fā)現(xiàn)機(jī)制。java spi就是提供這樣的一個機(jī)制:為某個接口尋找服務(wù)實(shí)現(xiàn)的機(jī)制。有點(diǎn)類似IOC的思想,就是將裝配的控制權(quán)移到程序之外,在模塊化設(shè)計(jì)中這個機(jī)制尤其重要。

How:怎么實(shí)現(xiàn)SPI?

第一步,建立日志服務(wù)接口jar

1.1 工程結(jié)構(gòu)


工程結(jié)構(gòu)

1.2 Logger接口


Logger接口

1.3 LoggerFactory類


?LoggerFactory類

1.4 工程打成jar包?


jar包

第二步,建立日志服務(wù)的具體實(shí)現(xiàn)

2.1 工程結(jié)構(gòu)


工程結(jié)構(gòu)

說明:(1)引入my-logging.jar;(2)新建一個Log5j類實(shí)現(xiàn)Logger接口;(3)新建一個META-INF/services文件夾,建一個你要實(shí)現(xiàn)的接口的名字命名的文件,既是com.my.Logger,里面的內(nèi)容就是這個接口的實(shí)現(xiàn)類的完全限定名,既是com.log5j.Log5j。

2.2?Logger接口實(shí)現(xiàn)類Log5j


接口實(shí)現(xiàn)類

2.3 配置文件com.my.Logger


配置文件com.my.Logger??

2.4 打包


jar包

第三步,建立測試項(xiàng)目test

3.1 工程結(jié)構(gòu)


工程結(jié)構(gòu)

3.2 測試類Test


測試類Test

3.3 測試結(jié)果


結(jié)果展示

What:什么是SPI?

SPI的全名為Service Provider Interface.大多數(shù)開發(fā)人員可能不熟悉,因?yàn)檫@個是針對廠商或者插件的。在java.util.ServiceLoader的文檔里有比較詳細(xì)的介紹。java spi的具體約定為:當(dāng)服務(wù)的提供者,提供了服務(wù)接口的一種實(shí)現(xiàn)之后,在jar包的META-INF/services/目錄里同時創(chuàng)建一個以服務(wù)接口命名的文件。該文件里就是實(shí)現(xiàn)該服務(wù)接口的具體實(shí)現(xiàn)類。而當(dāng)外部程序裝配這個模塊的時候,就能通過該jar包META-INF/services/里的配置文件找到具體的實(shí)現(xiàn)類名,并裝載實(shí)例化,完成模塊的注入。?基于這樣一個約定就能很好的找到服務(wù)接口的實(shí)現(xiàn)類,而不需要再代碼里制定。jdk提供服務(wù)實(shí)現(xiàn)查找的一個工具類:java.util.ServiceLoader.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容