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