1. 程式人生 > >內容解刨——dubbo自己的SPI實現

內容解刨——dubbo自己的SPI實現

dubbo的核心:SPI、AOP、IOC、compiler(動態編譯)
這篇文章主要明SPI

1、什麼是SPI

SPI英文為Service Provider Interface。
面向物件的設計裡,模組與模組之間是基於介面程式設計,模組之間不對實現類進行硬編碼,一旦程式碼時涉及具體實現類,就違反了可插拔的設計原則。如果需要替換一種實現,就要修改程式碼,為了實現在模組裝配的時候,不在模組裡寫死,就需要一種服務發現機制,java SPI就實現了這各種機制。
為某個接品尋找服務實現機制,有點類似於IOC的思想民,就是將裝配的控制權移到了程式碼之外。

2、SPI約定

當服務的提供者提供了一個介面多個實現時,一般會在jar包的META-INF/services/目錄下建立該介面的同文件,該檔案裡的內容就是該介面服務的具體實現類的名稱。而外部載入這個模組的時候,就能通過該jav包的META-INF/services裡面的配置檔案得到具體實現類名,並載入例項化,完成模組的裝配。
JDK提供服務實現查詢的一個工具類:java.util.ServiceLoader。

很多框架都使用了java的SPI機制,如JDBC4中的java.sql.Driver的SPI實現(mysql驅動、oracle驅動等)、common-logging的日誌介面實現。
下面我們來看一個mysql驅動包實現:

這裡寫圖片描述
在META-INF/services下有個檔案,名為java.sql.Driver,這是java sql驅動的介面,檔案的內容為com.mysql.jdbc.Driver,這個是實現類。

3、為什麼dubbo不採用JDK的SPI

1.JDK標準SPI會一次性載入例項化擴充套件點的所有實現,對於沒用上的擴充套件點實現也會載入,會浪費資源
2.增加了對擴充套件點IOC和AOP的支援,一個擴充套件點可以直接 setter 注入其它擴充套件點

4、dubbo的SPI的約定

  • SPI的儲存路徑在META-INF\dubbo\internal目錄下,並且檔名為介面的 全路徑,就是=介面的包我+介面名
  • 每個SPI檔案裡的格式定義為:副檔名=具體的類名

dubbo內部實現的各種擴充套件
這裡寫圖片描述

SPI檔案的儲存檔案路徑:META-INF/dubbo/internal/ dubbo內部實現的各種擴充套件

/META-INF/dubbo/internal/com.alibaba.dubbo.rpc.Filter

每個spi 檔案裡面的格式定義為: 副檔名=具體的類名,例如

echo=com.alibaba.dubbo.rpc.filter.EchoFilter
generic=com.alibaba.dubbo.rpc.filter.GenericFilter
genericimpl=com.alibaba.dubbo.rpc.filter.GenericImplFilter
token=com.alibaba.dubbo.rpc.filter.TokenFilter
.......

5、dubbo內部SPI的具體實現

在dubbo SPI中最關鍵的類是ExtensionLoader。每個定義的spi的介面都會構建一個ExtensionLoader例項,儲存在ExtensionLoader物件的ConcurrentMap

相關推薦

內容——dubbo自己SPI實現

dubbo的核心:SPI、AOP、IOC、compiler(動態編譯) 這篇文章主要明SPI 1、什麼是SPI SPI英文為Service Provider Interface。 面向物件的設計裡,模組與模組之間是基於介面程式設計,模組之間

Dubbo內核實現SPI簡單介紹

路徑 簡單 prot inter 策略模式 業務 services 具體實現 指定 Dubbo采用微內核+插件體系,使得設計優雅,擴展性強。那所謂的微內核+插件體系是如何實現的呢!即我們定義了服務接口標準,讓廠商去實現(如果不了解spi的請谷歌百度下), jdk通過Serv

Dubbo原始碼分析:Dubbo自己實現的IOC

  在建立自適應例項時,都會呼叫ExtensionLoader的injectExtension方法: @SuppressWarnings("unchecked") private T createAdaptiveExtension() { try {

DubboSPI機制(二)(Dubbo優化後的SPI實現

上一篇部落格: https://blog.csdn.net/Dongguabai/article/details/84345871 相關部落格: https://blog.csdn.net/Dongguabai/article/details/83754289  

DubboSPI原理詳

       SPI全稱為Service Provider Interface,是一種服務提供機制,比如在現實中我們經常會有這種場景,就是對於一個規範定義方而言(可以理解為一個或多個介面),具體的服務實現方是不可知的(可以理解為對這些介面的實現類),那麼在定義這些規範的時候,就需要規範定義方能夠通過一定的方式

DubboSPI機制詳

spi機制的思想提供一種更加靈活的,可插拔式的機制。本文分別對比了java和dubbo的spi的實現的區別,重點討論dubbo的實現原理。 java spi機制 SPI,Service Provider Interface,主要是被框架的開發人員使用,比如java.sql.Driver介面,其他不同廠商可

Dubbo原始碼學習--SPI實現@SPI和@Adaptive

上一篇部落格 Dubbo入門學習--Dubbo服務提供介面SPI機制我們已經簡單介紹了Dubbo的SPI機制,這篇部落格我們來剖析一下Dubbo是如何使用SPI機制的,在介面中使用@SPI("值")使用預設的實現類,如果我們不想使用預設的實現類是如何處理的。1、獲取指定實現類

Dubbo原始碼-SPI(二)SPI的目的和實現

上篇,我們講了spi的目的和約定,那麼從這篇起,我們原始碼的角度來看dubbo spi到底做了什麼,怎麼實現的. Dubbo spi的目的: 目的其實很假單,就是獲取一個實現類物件. Dubbo spi的途徑: ExtensionLoader.getExtension

tensorflow訓練自己的資料集實現CNN影象分類

利用卷積神經網路訓練影象資料分為以下幾個步驟1.讀取圖片檔案2.產生用於訓練的批次3.定義訓練的模型(包括初始化引數,卷積、池化層等引數、網路)4.訓練1 讀取圖片檔案def get_files(filename): class_train = [] label_trai

Dubbo系列之SPI實現機制(五)

private String createAdaptiveExtensionClassCode() { StringBuilder codeBuidler = new StringBuilder(); Method[] methods = type.getMethods(); boolean

6、DubboSPI機制分析5-Activate詳

group=com.alibaba.dubbo.demo.provider.activate.impl.GroupActivateExtImpl key=com.alibaba.dubbo.demo.provider.activate.impl.ValueActivateExtImpl order1=com

移動端h5開發相關內容總結css篇--自己總結

pan class 寬度 absolute html ive min-width 百分比 number 原文參考http://mp.weixin.qq.com/s/Nho2DHj-Y59j2F62vpN9jQ1.開發移動端,頭部必要的配置<meta name="vie

mktime很慢就自己實現一個吧

tdi ati 十分 ace += timestamp src clas [] mktime很慢就自己去實現一個吧

自己動手實現簡單權限控制

saweb 權限控制,很多項目會引入 shiro/spring-security。 shiro/spring-security 繼承 servlet-->filter抽象接口,運用合適的設計模式, 通過攔截客戶端請求,來實現各個角色對系統資源的訪問權限。 一時興起,有了自己實現權限控制的想法

cookies之自己構建cookies

進行 etc 之前 esc name prompt png wid new 之前感覺cookies有一種神秘感,慢慢隨著學習,可以抓到cookie,再到可以利用cookie。今天就來說一下自己構建一個cookie。 Talk is cheap ,show you the c

設計模式: 自己手動實現一個觀察者設計模式

package rgs name gree 觀察者設計模式 forecast server 它的 upd 觀察者模式: 定義了對象之間的一對多依賴,這樣一來。當一個對象(被觀察者)改變狀態時,它的全部依賴者(觀察者)都會收到通知並自己主動更新。 在觀察者模式中,會

linux命令行

朋友 mina width cmd 桌面化 cati 提示符 用戶 ges linux命令需要在命令行界面上操作(windows的cmd也是一個命令行界面)。只有在了解命令行界面含義才能知道我們輸入這些命令意義是什麽,為什麽要輸入這些命令。 首先我們要知道怎麽找出linux

容器_JDK源碼分析_自己簡單實現ArrayList容器

cap 裏的 而已 編寫 add col ++ emp 為我 這幾天仔細研究下關於ArrayList容器的jdk源碼,感覺收獲頗多,以前自己只知道用它,但它裏面具體是怎樣實現的就完全不清楚了。於是自己嘗試模擬寫下java的ArrayList容器,簡

對稱加密詳,以及JAVA簡單實現

turn bsp 十進制 stat mage 需要 對稱密鑰 else ges (原) 常用的加密有3種 1、正向加密,如MD5,加密後密文固定,目前還沒辦法破解,但是可以能過數據庫撞庫有一定概率找到,不過現在一般用這種方式加密都會加上鹽值。 2、對稱加密,通過一個固定