欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java的SPI機制實例詳解

 更新時間:2017年06月29日 10:49:49   投稿:lqh  
這篇文章主要介紹了Java的SPI機制實例詳解的相關(guān)資料,需要的朋友可以參考下

Java的SPI機制實例詳解

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

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

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

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

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

com.company1.ComparatorProvider

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

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) {
        //依據(jù)name排序 
    return o1.getName().compareTo(o2.getName());
  }
}

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

  //從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并不重要,所以你不必在意。你可以按照這個規(guī)則,寫另外一個排序規(guī)則的Jar,隨時可以更換你的排序規(guī)則.

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

相關(guān)文章

  • Java實現(xiàn)對象列表導(dǎo)出為excel表格的實用工具類

    Java實現(xiàn)對象列表導(dǎo)出為excel表格的實用工具類

    這篇文章主要為大家詳細介紹了Java如何實現(xiàn)對象列表導(dǎo)出為excel表格的實用工具類,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • IDEA集成Gitee碼云的實現(xiàn)步驟

    IDEA集成Gitee碼云的實現(xiàn)步驟

    本文主要介紹了IDEA集成Gitee碼云的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Java實現(xiàn)九九乘法表的小例子

    Java實現(xiàn)九九乘法表的小例子

    九九乘法表一般為三角形,每個數(shù)分別和從1到自身的數(shù)相乘然后把結(jié)果列出來,即要用到兩層循環(huán),外層是從1到9for(i=1;i<=9;i++),內(nèi)層是當(dāng)前數(shù)和從1到自身相乘for(j=1;j<=i;j++)
    2013-09-09
  • 詳解Spring mvc DispatchServlet 實現(xiàn)機制

    詳解Spring mvc DispatchServlet 實現(xiàn)機制

    本篇文章主要介紹了詳解Spring mvc DispatchServlet 實現(xiàn)機制,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • MyBatis Plus Mapper CRUD接口測試方式

    MyBatis Plus Mapper CRUD接口測試方式

    在數(shù)據(jù)庫管理系統(tǒng)中,插入記錄是添加新數(shù)據(jù)條目,而刪除操作包括根據(jù)主鍵ID單條刪除和批量刪除,也可以基于特定條件進行刪除,刪除操作的SQL語句是通過鍵值對在Map中拼接而成,如delete from 表 where key1=value1 AND key2=value2
    2024-09-09
  • Java日常練習(xí)題,每天進步一點點(28)

    Java日常練習(xí)題,每天進步一點點(28)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • Java中的javaBean、vo、entity、domain和pojo

    Java中的javaBean、vo、entity、domain和pojo

    這篇文章主要介紹了Java中的javaBean、vo、entity、domain和pojo用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Maven中的dependencyManagement 實例詳解

    Maven中的dependencyManagement 實例詳解

    dependencyManagement的中文意思就是依賴關(guān)系管理,它就是為了能通更好統(tǒng)一管理項目的版本號和各種jar版本號,可以更加方便升級,解決包沖突問題,這篇文章主要介紹了Maven中的dependencyManagement 實例詳解,需要的朋友可以參考下
    2024-02-02
  • Java中去除字符串中所有空格的幾種方法

    Java中去除字符串中所有空格的幾種方法

    這篇文章介紹了Java中去除字符串中所有空格的幾種方法,有需要的朋友可以參考一下
    2013-07-07
  • ehcache模糊批量移除緩存的方法

    ehcache模糊批量移除緩存的方法

    本篇文章主要介紹了ehcache模糊批量移除緩存的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02

最新評論