Java的SPI機(jī)制實(shí)例詳解
Java的SPI機(jī)制實(shí)例詳解
SPI的全名為Service Provider Interface.普通開發(fā)人員可能不熟悉,因?yàn)檫@個(gè)是針對(duì)廠商或者插件的。在java.util.ServiceLoader的文檔里有比較詳細(xì)的介紹。究其思想,其實(shí)是和"Callback"差不多?!癈allback”的思想是在我們調(diào)用API的時(shí)候,我們可以自己寫一段邏輯代碼,傳入到API里面,API內(nèi)部在合適的時(shí)候會(huì)調(diào)用它,從而實(shí)現(xiàn)某種程度的“定制”。
典型的是Collections.sort(List<T> list,Comparator<? super T> c)這個(gè)方法,它的第二個(gè)參數(shù)是一個(gè)實(shí)現(xiàn)Comparator接口的實(shí)例。我們可以根據(jù)自己的排序規(guī)則寫一個(gè)類,實(shí)現(xiàn)此接口,傳入此方法,那么這個(gè)方法就會(huì)根據(jù)我們的規(guī)則對(duì)list進(jìn)行排序。
把這個(gè)思想擴(kuò)展開來(lái),我們用SPI來(lái)重新實(shí)現(xiàn)上面的例子??蛻舭炎约旱呐判蛞?guī)則寫成一個(gè)類,并且打包成Jar文件,這個(gè)Jar文件里面必須有META-INF目錄,其下又有services目錄,其下有一個(gè)文本文件,文件名即為接口的全名:
java.util.Comparator。 --META-INF --services --java.util.Comparator
文件內(nèi)容只有一行:
com.company1.ComparatorProvider
這一行是你實(shí)現(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開始只是加載類,實(shí)例化要到第一次用的時(shí)候。類MyItem和方法showList并不重要,所以你不必在意。你可以按照這個(gè)規(guī)則,寫另外一個(gè)排序規(guī)則的Jar,隨時(shí)可以更換你的排序規(guī)則.
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Java實(shí)現(xiàn)對(duì)象列表導(dǎo)出為excel表格的實(shí)用工具類
這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)對(duì)象列表導(dǎo)出為excel表格的實(shí)用工具類,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12詳解Spring mvc DispatchServlet 實(shí)現(xiàn)機(jī)制
本篇文章主要介紹了詳解Spring mvc DispatchServlet 實(shí)現(xiàn)機(jī)制,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09MyBatis Plus Mapper CRUD接口測(cè)試方式
在數(shù)據(jù)庫(kù)管理系統(tǒng)中,插入記錄是添加新數(shù)據(jù)條目,而刪除操作包括根據(jù)主鍵ID單條刪除和批量刪除,也可以基于特定條件進(jìn)行刪除,刪除操作的SQL語(yǔ)句是通過(guò)鍵值對(duì)在Map中拼接而成,如delete from 表 where key1=value1 AND key2=value22024-09-09Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(28)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-07-07Java中的javaBean、vo、entity、domain和pojo
這篇文章主要介紹了Java中的javaBean、vo、entity、domain和pojo用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12Maven中的dependencyManagement 實(shí)例詳解
dependencyManagement的中文意思就是依賴關(guān)系管理,它就是為了能通更好統(tǒng)一管理項(xiàng)目的版本號(hào)和各種jar版本號(hào),可以更加方便升級(jí),解決包沖突問(wèn)題,這篇文章主要介紹了Maven中的dependencyManagement 實(shí)例詳解,需要的朋友可以參考下2024-02-02