中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

只知道API,今天初識SPI

2018-07-20    來源:編程學習網(wǎng)

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

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

java spi的具體約定如下 :

當服務(wù)的提供者,提供了服務(wù)接口的一種實現(xiàn)之后,在jar包的META-INF/services/目錄里同時創(chuàng)建一個以服務(wù)接口命名的文件。該文件里就是實現(xiàn)該服務(wù)接口的具體實現(xiàn)類。而當外部程序裝配這個模塊的時候,就能通過該jar包META-INF/services/里的配置文件找到具體的實現(xiàn)類名,并裝載實例化,完成模塊的注入。 基于這樣一個約定就能很好的找到服務(wù)接口的實現(xiàn)類,而不需要再代碼里指定。jdk提供服務(wù)實現(xiàn)查找的一個工具類:java.util.ServiceLoader。
一個例子說明jdk的spi。假一個內(nèi)容搜索接口,搜索的實現(xiàn)可能是基于文件系統(tǒng)的搜索,也可能是基于數(shù)據(jù)庫的搜索。

package com.ywsc.fenfenzhong.spi.learn; import java.util.List; public interface Search { public List<String> searchDoc(String keyword);   
}
文件搜索實現(xiàn) package com.ywsc.fenfenzhong.spi.learn; import java.util.List; public class FileSearch implements Search{ @Override public List<String> searchDoc(String keyword) {
        System.out.println("文件搜索 "+keyword); return null;
    }
}
數(shù)據(jù)庫搜索實現(xiàn) package com.ywsc.fenfenzhong.spi.learn; import java.util.List; public class DatabaseSearch implements Search{ @Override public List<String> searchDoc(String keyword) {
        System.out.println("數(shù)據(jù)搜索 "+keyword); return null;
    }
}

創(chuàng)建文件 com.ywsc.fenfenzhong.spi.learn.Search
文件內(nèi)容為 com.ywsc.fenfenzhong.spi.learn.FileSearch
目錄結(jié)構(gòu)為


屏幕快照 2016-04-06 下午11.04.53.png
測試方法 package com.ywsc.fenfenzhong.spi.learn; import java.util.Iterator; import java.util.ServiceLoader; public class TestCase { public static void main(String[] args) {
        ServiceLoader<Search> s = ServiceLoader.load(Search.class);
        Iterator<Search> iterator = s.iterator(); while (iterator.hasNext()) {
           Search search =  iterator.next();
           search.searchDoc("hello world");
        }
    }
}
輸出結(jié)果:文件搜索 hello world

文/dolphin叔叔(簡書作者)
原文鏈接:http://www.jianshu.com/p/5c3bb771dc5d

標簽: 代碼 數(shù)據(jù)庫 搜索

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:成為Web開發(fā)人員的7個簡單步驟

下一篇:學習yykit 一些小小總結(jié)