您好,登錄后才能下訂單哦!
本篇內容介紹了“Java的SPI機制是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
SPI的全名為Service Provider Interface.普通開發(fā)人員可能不熟悉,因為這個是針對廠商或者插件的。在java.util.ServiceLoader的文檔里有比較詳細的介紹。究其思想,其實是和"Callback"差不多?!癈allback”的思想是在我們調用API的時候,我們可以自己寫一段邏輯代碼,傳入到API里面,API內部在合適的時候會調用它,從而實現(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
文件內容只有一行:
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ī)則。
“Java的SPI機制是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網(wǎng)站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。