国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Java SPI機制原理及代碼實例

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

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

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

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

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

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

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

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

1.common-logging

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

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

2.jdbc

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

一個內容管理系統有一個搜索模塊。是基于接口編程的。搜索的實現可能是基于文件系統的搜索,也可能是基于數據庫的搜索

接口定義如下:

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

A公司采用文件系統搜索的方式實現了 Search接口,B公司采用了數據庫系統的方式實現了Search接口。

A公司實現的類:com.A.spi.impl.FileSearch

B公司實現的類:com.B.spi.impl.DatabaseSearch

那么A公司發布 實現jar包時,則要在jar包中META-INF/services/my.xyz.spi.Search文件中寫下如下內容:

com.A.spi.impl.FileSearch

那么B公司發布 實現jar包時,則要在jar包中META-INF/services/my.xyz.spi.Search文件中寫下如下內容:

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; }}

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

標簽: Java
相關文章:
主站蜘蛛池模板: 日产日韩亚洲欧美综合搜索 | 国产www| 亚洲区精品 | 成人中文字幕在线观看 | 日韩精品亚洲人成在线观看 | 日本三级毛片 | 久久免费精彩视频 | 人成18亚洲资源在线 | 欧美亚洲国产视频 | 国产成人精品免费午夜 | 91免费看国产 | 长腿校花被啪到腿软视频 | 在线播放国产真实女同事 | 韩国巨胸女三级视频网 | 深夜福利网站在线观看 | 欧美三级做爰全过程 | 亚洲成av人影片在线观看 | 成人欧美一区二区三区黑人 | 午夜限制r级噜噜片一区二区 | 免费国产不卡午夜福在线 | 99ri在线精品视频在线播放 | 天天噜夜夜操 | 日本黄网在线观看 | 另类在线 | 成人午夜亚洲影视在线观看 | 国内国产真实露脸对白 | 日韩精品一级毛片 | 乱码一区| a级毛片免费观看视频 | 色天天躁夜夜躁天干天干 | 国产无限制自拍 | 国内精品久久久久久久亚洲 | 国产精品视频免费观看调教网 | 精品国产品香蕉在线观看 | 91成人在线免费视频 | 欧美性色欧美a在线播放 | 91精品国产免费久久 | 高清国产精品久久久久 | 成人黄网18免费观看的网站 | 日韩一区二区天海翼 | 人成精品视频三区二区一区 |