日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Java的SPI機(jī)制介紹

SPI的全名為Service Provider Interface.普通開發(fā)人員可能不熟悉,因?yàn)檫@個(gè)是針對(duì)廠商或者插件的。在java.util.ServiceLoader的文檔里有比較詳細(xì)的介紹。究其思想,其實(shí)是和"Callback"差不多?!癈allback”的思想是在我們調(diào)用API的時(shí)候,我們可以自己寫一段邏輯代碼,傳入到API里面,API內(nèi)部在合適的時(shí)候會(huì)調(diào)用它,從而實(shí)現(xiàn)某種程度的“定制”。

典型的是Collections.sort(List list,Comparator c)這個(gè)方法,它的第二個(gè)參數(shù)是一個(gè)實(shí)現(xiàn)Comparator接口的實(shí)例。我們可以根據(jù)自己的排序規(guī)則寫一個(gè)類,實(shí)現(xiàn)此接口,傳入此方法,那么這個(gè)方法就會(huì)根據(jù)我們的規(guī)則對(duì)list進(jìn)行排序。

把這個(gè)思想擴(kuò)展開來,我們用SPI來重新實(shí)現(xiàn)上面的例子??蛻舭炎约旱呐判蛞?guī)則寫成一個(gè)類,并且打包成Jar文件,這個(gè)Jar文件里面必須有META-INF目錄,其下又有services目錄,其下有一個(gè)文本文件,文件名即為接口的全名:java.util.Comparator。

--META-INF
--services
--java.util.Comparator

文件內(nèi)容只有一行:

 
 
 
  1. com.company1.ComparatorProvider 

這一行是你實(shí)現(xiàn)了Comparator接口的類的全名,它的代碼如下:

 
 
 
  1. package com.company1; 
  2. import java.util.Comparator; 
  3. import com.mycompany.myapp.MyItem; 
  4. public class ComparatorProvider implements Comparator
  5.  
  6. @Override 
  7. public int compare(MyItem o1, MyItem o2) { 
  8. //依據(jù)name排序 
  9. return o1.getName().compareTo(o2.getName()); 

編譯打包后,把它放到你的主程序的class path里。下面是你的主程序:

 
 
 
  1. //從class path中所有Jar的META-INF目錄中搜索,找到合適的類并加載。 
  2. private static ServiceLoader serviceLoader 
  3. = ServiceLoader.load(Comparator.class); 
  4. public static void main(String[] args) 
  5. List myList = new ArrayList(); 
  6. myList.add(new MyItem(2,"c","hhh")); 
  7. myList.add(new MyItem(3,"k","ooo")); 
  8. myList.add(new MyItem(4,"d","ppp")); 
  9. myList.add(new MyItem(5,"b","ggg")); 
  10. showList(myList); 
  11. Collections.sort(myList,getCompartor()); 
  12. showList(myList); 
  13. @SuppressWarnings("unchecked") 
  14. private static Comparator getCompartor() { 
  15. for(Comparator service : serviceLoader) 
  16. return (Comparator)service; 
  17. return null; 

要注意的是serviceLoader開始只是加載類,實(shí)例化要到***次用的時(shí)候。類MyItem和方法showList并不重要,所以你不必在意。你可以按照這個(gè)規(guī)則,寫另外一個(gè)排序規(guī)則的Jar,隨時(shí)可以更換你的排序規(guī)則。


文章標(biāo)題:Java的SPI機(jī)制介紹
瀏覽路徑:http://www.dlmjj.cn/article/cojiojd.html