最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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 如何將圖片按照原尺寸比例存入word中

    java 如何將圖片按照原尺寸比例存入word中

    這篇文章主要介紹了java 如何將圖片按照原尺寸比例存入word中的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring?AOP對嵌套方法不起作用的解決

    Spring?AOP對嵌套方法不起作用的解決

    這篇文章主要介紹了Spring?AOP對嵌套方法不起作用的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • SpringBoot的配置文件(properties與yml)使用方法

    SpringBoot的配置文件(properties與yml)使用方法

    配置文件中的配置類型有兩類,一類是系統(tǒng)配置項,這種配置的格式都是固定的,是給系統(tǒng)使用的,另一種是用戶自定義配置,用戶可以隨意地規(guī)定配置項的格式,又用戶自行去設(shè)置和讀取,這篇文章主要介紹了SpringBoot的配置文件(properties與yml)使用方法,需要的朋友可以參考下
    2023-08-08
  • Spring事務(wù)失效場景的詳細整理

    Spring事務(wù)失效場景的詳細整理

    Spring 事務(wù)的傳播特性說的是,當多個事務(wù)同時存在的時候,Spring 如何處理這些事務(wù)的特性,下面這篇文章主要給大家介紹了關(guān)于Spring事務(wù)失效場景的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • Java畢業(yè)設(shè)計實戰(zhàn)之藥店信息管理系統(tǒng)的實現(xiàn)

    Java畢業(yè)設(shè)計實戰(zhàn)之藥店信息管理系統(tǒng)的實現(xiàn)

    這是一個使用了java+SSM+JSP+layui+maven+mysql開發(fā)的藥店信息管理系統(tǒng),是一個畢業(yè)設(shè)計的實戰(zhàn)練習,具有藥店信息管理該有的所有功能,感興趣的朋友快來看看吧
    2022-01-01
  • Java自然排序Comparable使用方法解析

    Java自然排序Comparable使用方法解析

    這篇文章主要介紹了Java自然排序Comparable使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • Spring boot如何基于攔截器實現(xiàn)訪問權(quán)限限制

    Spring boot如何基于攔截器實現(xiàn)訪問權(quán)限限制

    這篇文章主要介紹了Spring boot如何基于攔截器實現(xiàn)訪問權(quán)限限制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • 高效Java尺寸壓縮技巧,節(jié)省資源成本

    高效Java尺寸壓縮技巧,節(jié)省資源成本

    如果你想了解如何優(yōu)化Java應(yīng)用程序的尺寸,節(jié)省存儲空間并提升性能,那么你來對地方了,本指南將教你簡單實用的技巧和最佳實踐,幫助你輕松減小Java應(yīng)用程序的體積,讓你的代碼更高效、更精簡,讓我們一起開始吧,讓Java應(yīng)用程序變得更小巧而強大!
    2023-12-12
  • 如何自定義Mybatis-Plus分布式ID生成器(解決ID長度超過JavaScript整數(shù)安全范圍問題)

    如何自定義Mybatis-Plus分布式ID生成器(解決ID長度超過JavaScript整數(shù)安全范圍問題)

    MyBatis-Plus默認生成的是 64bit 長整型,而 JS 的 Number 類型精度最高只有 53bit,這篇文章主要介紹了如何自定義Mybatis-Plus分布式ID生成器(解決ID長度超過JavaScript整數(shù)安全范圍問題),需要的朋友可以參考下
    2024-08-08
  • SpringBoot bean依賴屬性配置詳細介紹

    SpringBoot bean依賴屬性配置詳細介紹

    Spring容器是Spring的核心,一切SpringBean都存儲在Spring容器內(nèi)??梢哉fbean是spring核心中的核心。Bean配置信息定義了Bean的實現(xiàn)及依賴關(guān)系,這篇文章主要介紹了SpringBoot bean依賴屬性配置
    2022-09-09

最新評論

井陉县| 岳普湖县| 青浦区| 陕西省| 温宿县| 泉州市| 静海县| 锦屏县| 元阳县| 长丰县| 得荣县| 长泰县| 珲春市| 唐海县| 东兴市| 阜平县| 尼玛县| 新沂市| 民权县| 房山区| 东至县| 铁岭市| 阳原县| 龙江县| 紫云| 白玉县| 河西区| 名山县| 禄丰县| 义马市| 武汉市| 光山县| 同心县| 汽车| 巧家县| 玛多县| 南丹县| 梁山县| 尚志市| 府谷县| 岚皋县|