欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java SPI機(jī)制原理及代碼實(shí)例

 更新時(shí)間:2020年06月12日 09:00:41   作者:Java技術(shù)棧  
這篇文章主要介紹了Java SPI機(jī)制原理及代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

SPI的全名為:Service Provider Interface,大多數(shù)開(kāi)發(fā)人員可能不熟悉,因?yàn)檫@個(gè)是針對(duì)廠商或者插件的。在java.util.ServiceLoader的文檔里有比較詳細(xì)的介紹。

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

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

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

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

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

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

1.common-logging

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

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

2.jdbc

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

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

接口定義如下:

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

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

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

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

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

com.A.spi.impl.FileSearch

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

com.B.spi.impl.DatabaseSearch

下面是 SPI 測(cè)試代碼:

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 關(guān)于MVC的dao層、service層和controller層詳解

    關(guān)于MVC的dao層、service層和controller層詳解

    這篇文章主要介紹了關(guān)于MVC的dao層、service層和controller層詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 詳解Java內(nèi)存管理中的JVM垃圾回收

    詳解Java內(nèi)存管理中的JVM垃圾回收

    這篇文章給大家分享了關(guān)于Java內(nèi)存管理中的JVM垃圾回收的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。
    2018-08-08
  • SpringBoot中修改依賴版本的方法

    SpringBoot中修改依賴版本的方法

    這篇文章主要介紹了SpringBoot中如何修改依賴的版本,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • java&javascript自定義加密數(shù)據(jù)傳輸代碼示例

    java&javascript自定義加密數(shù)據(jù)傳輸代碼示例

    這篇文章主要介紹了java&javascript自定義加密數(shù)據(jù)傳輸代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • SpringBoot?Profiles?多環(huán)境配置及切換

    SpringBoot?Profiles?多環(huán)境配置及切換

    大部分情況下,我們開(kāi)發(fā)的產(chǎn)品應(yīng)用都會(huì)根據(jù)不同的目的,所以需要支持不同的環(huán)境,本文主要介紹了SpringBoot?Profiles?多環(huán)境配置及切換,感興趣的可以了解一下
    2021-12-12
  • ProtoStuff不支持BigDecimal序列化及反序列化詳解

    ProtoStuff不支持BigDecimal序列化及反序列化詳解

    這篇文章主要為大家介紹了ProtoStuff不支持BigDecimal序列化/反序列化,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • SpringBoot集成Hadoop對(duì)HDFS的文件操作方法

    SpringBoot集成Hadoop對(duì)HDFS的文件操作方法

    這篇文章主要介紹了SpringBoot集成Hadoop對(duì)HDFS的文件操作方法,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • Java實(shí)現(xiàn)計(jì)網(wǎng)循環(huán)冗余檢驗(yàn)算法的方法示例

    Java實(shí)現(xiàn)計(jì)網(wǎng)循環(huán)冗余檢驗(yàn)算法的方法示例

    這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)計(jì)網(wǎng)循環(huán)冗余檢驗(yàn)算法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 最新jsonwebtoken-jwt 0.12.3 基本使用小結(jié)

    最新jsonwebtoken-jwt 0.12.3 基本使用小結(jié)

    這篇文章主要介紹了最新jsonwebtoken-jwt 0.12.3 基本使用小結(jié),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-12-12
  • Spring的@CrossOrigin注解使用與CrossFilter對(duì)象自定義詳解

    Spring的@CrossOrigin注解使用與CrossFilter對(duì)象自定義詳解

    這篇文章主要介紹了Spring的@CrossOrigin注解使用與CrossFilter對(duì)象自定義詳解,跨域,指的是瀏覽器不能執(zhí)行其他網(wǎng)站的腳本,它是由瀏覽器的同源策略造成的,是瀏覽器施加的安全限制,所謂同源是指,域名,協(xié)議,端口均相同,需要的朋友可以參考下
    2023-12-12

最新評(píng)論