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