我們現(xiàn)在需要使用一個(gè)內(nèi)容搜索接口,搜索的實(shí)現(xiàn)可能是基于文件系統(tǒng)的搜索,也可能是基于數(shù)據(jù)庫(kù)的搜索。
先定義好接口:
文件搜索實(shí)現(xiàn):
數(shù)據(jù)庫(kù)搜索實(shí)現(xiàn):
resources下新建META-INF/services/目錄,然后新建接口全限定名的文件:com.cainiao.ys.spi.learn.Search,里面加上我們需要用到的實(shí)現(xiàn)類
測(cè)試方法:
可以看到輸出結(jié)果:文件搜索 hello world
如果在com.cainiao.ys.spi.learn.Search文件里寫上兩個(gè)實(shí)現(xiàn)類,那最后的輸出結(jié)果就是兩行了。
這就是因?yàn)镾erviceLoader.load(Search.class)在加載某接口時(shí),會(huì)去META-INF/services下找接口的全限定名文件,再根據(jù)里面的內(nèi)容加載相應(yīng)的實(shí)現(xiàn)類。
這就是spi的思想,接口的實(shí)現(xiàn)由provider實(shí)現(xiàn),provider只用在提交的jar包里的META-INF/services下根據(jù)平臺(tái)定義的接口新建文件,并添加進(jìn)相應(yīng)的實(shí)現(xiàn)類內(nèi)容就好。