最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JAVA SPI機制詳解使用方法

 更新時間:2022年07月05日 10:28:08   作者:cloneme01  
Java定義了一套JDBC的接口,但并未提供具體實現(xiàn)類,而是在不同云廠商提供的數(shù)據庫實現(xiàn)包。這篇文章給大家介紹Java的SPI機制,感興趣的朋友一起看看吧

寫在前面

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

SPI的調用流程

什么是SPI

SPI全稱Service Provider Interface,是Java提供的一套用來被第三方實現(xiàn)或者擴展的API,它可以用來啟用框架擴展和替換組件。Java SPI 實際上是“基于接口的編程+策略模式+配置文件”組合實現(xiàn)的動態(tài)加載機制。在面向對象的編程與設計中,一般推薦模塊之間要基于接口編程,模塊之間不對實現(xiàn)類進行硬編碼,一旦代碼里涉及了具體的實現(xiàn)類,就違反了可拔插的原則,如果需要替換另外一種實現(xiàn),就需要修改代碼。

使用場景

使用Java SPI機制的優(yōu)勢是實現(xiàn)解耦,使得第三方服務模塊的裝配控制的邏輯與調用者的業(yè)務代碼分離,而不是耦合在一起,應用程序可以根據實際業(yè)務情況啟用框架擴展或替換框架組件,常見的場景如下:
(1). JDBC加載不同類型的驅動
(2). SLF4J對Log4j/Logback的支持

實現(xiàn)約定

(1). 服務提供者提供接口的具體實現(xiàn),在JAVA包的META-INF/services目錄下創(chuàng)建一個以“接口全限定名”為命名的文件,內容為實現(xiàn)類的全限定名;
(2). 接口具體實現(xiàn)類所在的JAR包需要放在主程序的CLASSPATH中;
(3). 主程序通過java.util.ServiceLoder動態(tài)加載具體的實現(xiàn)模塊,它通過掃描META-INF/services目錄下的配置文件,找到具體實現(xiàn)類并把它加載到JVM中;
(4). SPI的實現(xiàn)類必須攜帶一個不帶參數(shù)的構造函數(shù)。

四種角色

(1). 提供某種功能的接口(SLF4J 提供了一組接口類)
(2). 提供某種功能接口的具體實現(xiàn)(每個具體的實現(xiàn)需要包含:META-INF/services目錄下創(chuàng)建一個以“接口全限定名”為命名的文件,內容為實現(xiàn)類的全限定名。Log4j/Logback提供了具體的實現(xiàn))
(3). 提供發(fā)現(xiàn)和加載CLASSPATH中所有的接口具體實現(xiàn)的對象
(4). 客戶端(接口的使用者)

關于JAVA SPI詳細的介紹請看:JAVA - SPI機制使用詳解(一)

基于JAVA原生特性實現(xiàn)的JAVA SPI機制的DEMO

1. 主要角色

主要角色有:接口、多個實現(xiàn)類以及測試客戶端,在每個實現(xiàn)類中需要創(chuàng)建信息文件:resources/META-INF/services/接口全限定名一致的文件。接口、多個實現(xiàn)類以及客戶端分別在不同的MODULE中。

2. 示例代碼

①. 接口:

package com.hadoopx.javax.spi;
public interface Coder {
    public String write();
}

②. 第一個實現(xiàn)類:

package com.hadoopx.javax.spi;
public class Javaer implements Coder {
    public String write() {
        return "I'M JAVA CODER, USE JAVA TO WRITE EVERYTHING.";
    }
}
創(chuàng)建信息說明文件:resources/META-INF/services/com.hadoopx.javax.spi.Coder,
里面的內容為:com.hadoopx.javax.spi.Javaer

③. 第二個實現(xiàn)類:

package com.hadoopx.javax.spi;
public class Rubyer implements Coder {
    public String write() {
        return "I'M RUBY CODER, USE RUBY TO WRITE EVERYTHING.";
    }
}
創(chuàng)建信息說明文件:resources/META-INF/services/com.hadoopx.javax.spi.Coder,
里面的內容為:com.hadoopx.javax.spi.Rubyer

④. 客戶端:

添加依賴:
<dependencies>
    <dependency>
        <groupId>com.hadoopx</groupId>
        <artifactId>javax-spi001-javaer</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>com.hadoopx</groupId>
        <artifactId>javax-spi001-rubyer</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>
客戶端代碼:
package com.hadoopx.javax.spi;
public class MyTest {
    public static void main(String[] args) {
        ServiceLoader<Coder> s = ServiceLoader.load(Coder.class);
        Iterator<Coder> iterator = s.iterator();
        while (iterator.hasNext()) {
            Coder lang =  iterator.next();
            String content = lang.write();
            System.out.println(content);
        }
    }
}

輸出結果為:

I'M JAVA CODER, USE JAVA TO WRITE EVERYTHING.
I'M RUBY CODER, USE RUBY TO WRITE EVERYTHING.

3. 說明

在實際的使用過程中,需要指定不同的類型來創(chuàng)建不同的實現(xiàn)類實例。

基于SPRING BOOT實現(xiàn)的JAVA SPI機制的DEMO

注意: 在每個實現(xiàn)類中不需要創(chuàng)建信息文件。

①. 接口:

package com.hadoopx.javax.spi;
public interface Coder {
    public String write();
}

②. 第一個實現(xiàn)類:

package com.hadoopx.javax.spi;
@Service
@Primary
public class Javaer implements Coder {
    public String write() {
        return "I'M JAVA CODER, USE JAVA TO WRITE EVERYTHING.";
    }
}

③. 第二個實現(xiàn)類:

package com.hadoopx.javax.spi;
@Service
public class Rubyer implements Coder {
    public String write() {
        return "I'M RUBY CODER, USE RUBY TO WRITE EVERYTHING.";
    }
}

④. 客戶端一:

添加依賴:
<dependencies>
    <dependency>
        <groupId>com.hadoopx</groupId>
        <artifactId>javax-spi002-javaer</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>com.hadoopx</groupId>
        <artifactId>javax-spi002-rubyer</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>
客戶端代碼:
@RestController
@RequestMapping("/t")
@Api(value = "測試服務", description = "該服務僅僅用于完成驗證、學習和測試")
public class TestController {
	// 切換不同的服務
    @Autowired
    @Qualifier("javaer")
    private Coder coder;
    @ApiOperation(value = "測試", notes = "基于SPRING BOOT實現(xiàn)的JAVA SPI機制的DEMO")
    @GetMapping("/spi")
    public String test() {
        System.out.println(coder.write());
        return "ok";
    }
}

輸出結果為:

I'M JAVA CODER, USE JAVA TO WRITE EVERYTHING.

⑤. 客戶端二:

有時會根據不同的情況,調用不同服務的方法,所以在客戶端中需要多增加下面這個文件:

@Service
public class CoderContext {
	// 通過 @Autowired 把Coder所有的實現(xiàn)類注入到map(coders)中.
	// Spring會查找應用的上下文里類型為Coder的Bean, 并把查找到的Bean注入到Map<String, Coder> 或者 List<Coder>中
    @Autowired
    Map<String, Coder> coders;
    public Coder getCoder(String key){
        return coders.get(key);
    }
}
客戶端代碼:
@RestController
@RequestMapping("/t")
@Api(value = "測試服務", description = "該服務僅僅用于完成驗證、學習和測試")
public class TestController {
    @Autowired
    private CoderContext coderContext;
    @ApiOperation(value = "測試", notes = "基于SPRING BOOT實現(xiàn)的JAVA SPI機制的DEMO")
    @GetMapping("/spi")
    public String test(String type) {
        System.out.println(coderContext.getCoder(type).write());
        return "ok";
    }
}

到此這篇關于JAVA SPI機制詳解使用方法的文章就介紹到這了,更多相關JAVA SPI機制內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java使用xfire搭建webservice服務的過程詳解

    java使用xfire搭建webservice服務的過程詳解

    這篇文章主要介紹了java使用xfire搭建webservice服務的過程。使用xfire搭建webService的服務,可以在瀏覽器訪問。對此感興趣的可以了解一下
    2020-07-07
  • spring boot使用自定義注解做AOP的案例代碼

    spring boot使用自定義注解做AOP的案例代碼

    這篇文章主要介紹了spring boot使用自定義注解做AOP的案例代碼,代碼簡單易懂,通過創(chuàng)建一個自定注解,接收一個傳值type,感興趣的朋友一起看看吧
    2024-06-06
  • Java仿12306圖片驗證碼

    Java仿12306圖片驗證碼

    這篇文章主要為大家詳細介紹了Java仿12306的圖片驗證碼的相關資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-04-04
  • java Struts2框架下實現(xiàn)文件上傳功能

    java Struts2框架下實現(xiàn)文件上傳功能

    這篇文章主要為大家詳細介紹了java Struts2框架下實現(xiàn)文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • java8新特性-lambda表達式入門學習心得

    java8新特性-lambda表達式入門學習心得

    這篇文章主要介紹了java8新特性-lambda表達式入門學習心得,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 深入了解MyBatis參數(shù)

    深入了解MyBatis參數(shù)

    今天小編就為大家分享一篇關于深入了解MyBatis參數(shù),小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • SpringBoot2.0.3打印默認數(shù)據源為 HikariDataSource (null)問題

    SpringBoot2.0.3打印默認數(shù)據源為 HikariDataSource (null)問題

    這篇文章主要介紹了SpringBoot2.0.3打印默認數(shù)據源為 HikariDataSource (null)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • IDEA Project不顯示/缺失文件問題及解決

    IDEA Project不顯示/缺失文件問題及解決

    在側邊欄的project模式下,如果發(fā)現(xiàn)缺少部分文件,可以嘗試關閉項目,打開項目所在目錄,刪除目錄下的.idea文件夾,然后重新打開項目即可解決
    2024-11-11
  • java servlet結合mysql搭建java web開發(fā)環(huán)境

    java servlet結合mysql搭建java web開發(fā)環(huán)境

    之前寫過一篇 servlet+oracle的文章,但是那是因為公司有可能接那么一個項目,然后我當時也比較閑,所以隨便學了下,那玩意是白去研究了,因為公司后面并沒接到那項目。
    2015-12-12
  • 詳解Java中ThreadLocal類型及簡單用法

    詳解Java中ThreadLocal類型及簡單用法

    ThreadLocal實例通常是希望將狀態(tài)與線程關聯(lián)起來的類中的私有靜態(tài)字段,下面通過例子給大家詳細介紹Java中ThreadLocal類型及簡單用法,感興趣的朋友跟隨小編一起看看吧
    2021-10-10

最新評論

江陵县| 襄汾县| 泗阳县| 西青区| 黄冈市| 三河市| 马鞍山市| 杂多县| 大丰市| 民乐县| 郸城县| 康定县| 改则县| 竹北市| 察哈| 兰考县| 天等县| 元氏县| 壶关县| 门源| 巢湖市| 桦川县| 上高县| 五大连池市| 吉木乃县| 虹口区| 东乌珠穆沁旗| 花莲县| 宜兰市| 日喀则市| 怀集县| 临漳县| 永济市| 汉阴县| 宁陕县| 监利县| 四平市| 尼木县| 滕州市| 大港区| 仁化县|