av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

Java SPI機制原理及代碼實例

瀏覽:4日期:2022-08-31 09:56:45

SPI的全名為:Service Provider Interface,大多數(shù)開發(fā)人員可能不熟悉,因為這個是針對廠商或者插件的。在java.util.ServiceLoader的文檔里有比較詳細的介紹。

簡單的總結(jié)下 Java SPI 機制的思想。我們系統(tǒng)里抽象的各個模塊,往往有很多不同的實現(xiàn)方案,比如日志模塊的方案,xml解析模塊、jdbc模塊的方案等。面向的對象的設(shè)計里,我們一般推薦模塊之間基于接口編程,模塊之間不對實現(xiàn)類進行硬編碼。

一旦代碼里涉及具體的實現(xiàn)類,就違反了可拔插的原則,如果需要替換一種實現(xiàn),就需要修改代碼。為了實現(xiàn)在模塊裝配的時候能不在程序里動態(tài)指明,這就需要一種服務(wù)發(fā)現(xiàn)機制。

Java SPI 就是提供這樣的一個機制:為某個接口尋找服務(wù)實現(xiàn)的機制。有點類似IOC的思想,就是將裝配的控制權(quán)移到程序之外,在模塊化設(shè)計中這個機制尤其重要。

Java SPI 的具體約定為:當服務(wù)的提供者,提供了服務(wù)接口的一種實現(xiàn)之后,在jar包的META-INF/services/目錄里同時創(chuàng)建一個以服務(wù)接口命名的文件。該文件里就是實現(xiàn)該服務(wù)接口的具體實現(xiàn)類。

而當外部程序裝配這個模塊的時候,就能通過該jar包META-INF/services/里的配置文件找到具體的實現(xiàn)類名,并裝載實例化,完成模塊的注入。

基于這樣一個約定就能很好的找到服務(wù)接口的實現(xiàn)類,而不需要再代碼里制定。jdk提供服務(wù)實現(xiàn)查找的一個工具類:java.util.ServiceLoader。

1.common-logging

apache最早提供的日志的門面接口。只有接口,沒有實現(xiàn)。具體方案由各提供商實現(xiàn), 發(fā)現(xiàn)日志提供商是通過掃描 META-INF/services/org.apache.commons.logging.LogFactory配置文件,通過讀取該文件的內(nèi)容找到日志提工商實現(xiàn)類。

只要我們的日志實現(xiàn)里包含了這個文件,并在文件里制定 LogFactory工廠接口的實現(xiàn)類即可。關(guān)注Java技術(shù)棧微信公眾號,在后臺回復(fù)關(guān)鍵字:Java,可以獲取更多棧長整理的Java技術(shù)干貨。

2.jdbc

jdbc4.0以前, 開發(fā)人員還需要基于Class.forName('xxx')的方式來裝載驅(qū)動,jdbc4也基于spi的機制來發(fā)現(xiàn)驅(qū)動提供商了,可以通過META-INF/services/java.sql.Driver文件里指定實現(xiàn)類的方式來暴露驅(qū)動提供者。

一個內(nèi)容管理系統(tǒng)有一個搜索模塊。是基于接口編程的。搜索的實現(xiàn)可能是基于文件系統(tǒng)的搜索,也可能是基于數(shù)據(jù)庫的搜索

接口定義如下:

package my.xyz.spi;import java.util.List;public interface Search { public List serch(String keyword);}

A公司采用文件系統(tǒng)搜索的方式實現(xiàn)了 Search接口,B公司采用了數(shù)據(jù)庫系統(tǒng)的方式實現(xiàn)了Search接口。

A公司實現(xiàn)的類:com.A.spi.impl.FileSearch

B公司實現(xiàn)的類:com.B.spi.impl.DatabaseSearch

那么A公司發(fā)布 實現(xiàn)jar包時,則要在jar包中META-INF/services/my.xyz.spi.Search文件中寫下如下內(nèi)容:

com.A.spi.impl.FileSearch

那么B公司發(fā)布 實現(xiàn)jar包時,則要在jar包中META-INF/services/my.xyz.spi.Search文件中寫下如下內(nèi)容:

com.B.spi.impl.DatabaseSearch

下面是 SPI 測試代碼:

package com.xyz.factory;import java.util.Iterator;import java.util.ServiceLoader;import my.xyz.spi.Search;public class SearchFactory { private SearchFactory() { } public static Search newSearch() { Search search = null; ServiceLoader<Search> serviceLoader = ServiceLoader.load(Search.class); Iterator<Search> searchs = serviceLoader.iterator(); if (searchs.hasNext()) { search = searchs.next(); } return search; }}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: Java
相關(guān)文章:
主站蜘蛛池模板: 蜜桃视频在线观看免费视频网站www | 久久国产高清 | 日日骚视频 | 992tv人人草 久久精品超碰 | 国产高清一区二区三区 | 久久久久9999| 91精品久久久久久久久久 | 日韩精品在线观看网站 | 国产精品不卡 | 日韩一级黄色毛片 | www.日日干| 精品国产31久久久久久 | 涩涩视频网站在线观看 | 日韩视频中文字幕 | 亚洲一区二区三区乱码aⅴ 四虎在线视频 | 欧美一区二区三区大片 | 国产网站在线免费观看 | 欧美日韩国产一区二区 | 在线一级片| 欧美在线播放一区 | 欧美国产免费 | 成人免费影院 | 粉嫩粉嫩芽的虎白女18在线视频 | 日韩中文字幕av | 人人干人人艹 | 欧美最猛性xxxxx亚洲精品 | 国产精品s色 | 日韩欧美精品一区 | 精品福利在线 | 99国产精品99久久久久久粉嫩 | 中文字幕日韩在线 | 99精品观看| 欧美五月婷婷 | 国产成人精品免费视频大全最热 | 日韩一区二区视频 | 国产精品免费在线 | 网址黄| 一区二区三区四区五区在线视频 | av一级久久| 国产欧美一区二区三区免费 | 亚洲天堂中文字幕 |