国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java的SPI機制實例詳解

Java的SPI機制實例詳解

2020-11-26 13:35mars914 Java教程

這篇文章主要介紹了Java的SPI機制實例詳解的相關資料,需要的朋友可以參考下

Java的SPI機制實例詳解

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目錄,其下有一個文本文件,文件名即為接口的全名:

?
1
2
3
4
java.util.Comparator。
--META-INF
 --services
  --java.util.Comparator

文件內容只有一行:

?
1
com.company1.ComparatorProvider

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

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

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

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

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

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

原文鏈接:http://mars914.iteye.com/blog/1283859

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品国产一区二区在线 | 免费一二区 | 综合久久久久 | 一级毛片免费版 | 高清视频一区二区三区 | 精品国精品国产自在久不卡 | 特及毛片| 久久99精品久久久久久 | 精品久久久久久久久久久 | 热久久国产| 国产特级毛片aaaaaaa高清 | 欧美另类视频在线 | 久久久国产视频 | 亚洲精品视频在线观看免费视频 | 亚洲第一成人久久网站 | 婷婷狠狠| 成人午夜小视频 | 成人性大片免费观看网站 | 日本在线免费 | 一级黄色免费片 | 超碰av在线 | 亚洲第一黄色网 | 伊人久久艹 | 国产欧美精品一区二区三区四区 | 一级黄色免费毛片 | 99精品国产高清在线观看 | 日本不卡一区二区 | 精品少妇一区二区三区日产乱码 | 一区二区三区四区日韩 | 插插射啊爱视频日a级 | 日韩精品在线一区 | 国产精品久久久久久久7电影 | 亚州中文字幕 | 日韩一区精品 | 免费观看一级淫片 | 亚洲精选一区二区 | 黄色片网站在线看 | 亚洲精品无 | 欧美日韩精品一区 | 午夜免费福利视频 | 一区二区三区视频 |