程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java的SPI機制介紹

Java的SPI機制介紹

編輯:關於JAVA

SPI的全名為Service Provider Interface.普通開發人員可能不熟悉,因為這個是針對廠商或者插件的。在Java.util.ServiceLoader的文檔裡有比較詳細的介紹。究其思想,其實是和"Callback"差不多。“Callback”的思想是在我們調用API的時候,我們可以自己寫一段邏輯代碼,傳入到API裡面,API內部在合適的時候會調用它,從而實現某種程度的“定制”。

典型的是Collections.sort(List<T> list,Comparator<? super T> c)這個方法,它的第二個參數是一個實現Comparator接口的實例。我們可以根據自己的排序規則寫一個類,實現此接口,傳入此方法,那麼這個方法就會根據我們的規則對list進行排序。

把這個思想擴展開來,我們用SPI來重新實現上面的例子。客戶把自己的排序規則寫成一個類,並且打包成Jar文件,這個Jar文件裡面必須有META-INF目錄,其下又有services目錄,其下有一個文本文件,文件名即為接口的全名:Java.util.Comparator。

--META-INF
--services
--Java.util.Comparator

文件內容只有一行:

  1. com.company1.ComparatorProvider

這一行是你實現了Comparator接口的類的全名,它的代碼如下:

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

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

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

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved