摘要:為了實(shí)現(xiàn)在模塊裝配的時(shí)候,不在模塊里寫死代碼,就需要一種服務(wù)發(fā)現(xiàn)機(jī)制。就提供了這樣一種機(jī)制為某個(gè)接口尋找服務(wù)實(shí)現(xiàn),有點(diǎn)類似思想,將裝配的控制權(quán)移到代碼之外。即接口文件的全類名。五示例遵循上述第一條第點(diǎn),這里為接口文件,其中和為兩個(gè)實(shí)現(xiàn)類。
一、Dubbo內(nèi)核
Dubbo內(nèi)核主要包含SPI、AOP、IOC、Compiler。
二、JDK的SPI1.spi的設(shè)計(jì)目標(biāo):
面向?qū)ο蟮脑O(shè)計(jì)里,模塊之間是基于接口編程,模塊質(zhì)檢不對(duì)實(shí)現(xiàn)類進(jìn)行硬編碼。一旦代碼里涉及具體的實(shí)現(xiàn)類,就違反了可插拔的原則,如果需要替換一種實(shí)現(xiàn),就需要修改代碼。為了實(shí)現(xiàn)在模塊裝配的時(shí)候,不在模塊里寫死代碼,就需要一種服務(wù)發(fā)現(xiàn)機(jī)制。Java SPI就提供了這樣一種機(jī)制:為某個(gè)接口尋找服務(wù)實(shí)現(xiàn),有點(diǎn)類似IOC思想,將裝配的控制權(quán)移到代碼之外。
2.JDK的SPI的默認(rèn)約定
當(dāng)服務(wù)的提供者提供了一個(gè)接口的多種實(shí)現(xiàn)時(shí),一般會(huì)在jar包的META-INF/services目錄下,創(chuàng)建該接口的同名文件,文件的內(nèi)容就是該服務(wù)接口的具體實(shí)現(xiàn)類的全類名。
三、Dubbo為什么不采用JDK的SPIJDK標(biāo)準(zhǔn)的SPI會(huì)一次性實(shí)例化擴(kuò)展點(diǎn)所有實(shí)現(xiàn),如果有擴(kuò)展實(shí)現(xiàn)初始化很耗時(shí)。但如果沒用上也加載,會(huì)很浪費(fèi)資源。針對(duì)這個(gè)問題,Dubbo增加了對(duì)擴(kuò)展點(diǎn)IoC和AOP的支持,一個(gè)擴(kuò)展點(diǎn)可以直接setter注入其它擴(kuò)展點(diǎn)。
四、Dubbo SPI的默認(rèn)約定1.spi 文件存儲(chǔ)路徑在META-INFdubbointernal 目錄下并且文件名為接口的全路徑名。即接口文件的全類名。
2.每個(gè)spi 文件里面的格式定義為: 擴(kuò)展名=具體的類名,例如 dubbo=com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtoco。使用時(shí)通過key加載(如dubbo),可以實(shí)現(xiàn)部分加載。
五、SPI示例
遵循上述第一條第2點(diǎn),這里Command為接口文件,其中StartCommand和ShutdownCommand為兩個(gè)實(shí)現(xiàn)類。需要在resources目錄下建META-INF子目錄,在META-INF下建services目錄,然后以接口全路徑作為文件名創(chuàng)建文件,內(nèi)容為接口實(shí)現(xiàn)類的全類型名。
Command.java
package com.dongqiang.soa.spi; /** * Created by qiangdong on 2018/2/2. */ public interface Command { void execute(); }
StartCommand.java
package com.dongqiang.soa.spi; /** * Created by qiangdong on 2018/2/2. */ public class StartCommand implements Command { @Override public void execute() { System.out.println("start command."); } }
ShutdownCommand.java
package com.dongqiang.soa.spi; /** * Created by qiangdong on 2018/2/2. */ public class ShutdownCommand implements Command { @Override public void execute() { System.out.println("ShutdownCommand"); } }
Main類:
package com.dongqiang.soa.spi; import java.util.ServiceLoader; /** * Created by qiangdong on 2018/2/2. */ public class Main { public static void main(String[] args) { ServiceLoaderserviceLoader = ServiceLoader.load(Command.class); for (Command command : serviceLoader) { command.execute(); } } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/68501.html
摘要:今天我想聊聊的另一個(gè)很棒的特性就是它的可擴(kuò)展性。的擴(kuò)展機(jī)制在的官網(wǎng)上,描述自己是一個(gè)高性能的框架。接下來的章節(jié)中我們會(huì)慢慢揭開擴(kuò)展機(jī)制的神秘面紗。擴(kuò)展擴(kuò)展點(diǎn)的實(shí)現(xiàn)類。的定義在配置文件中可以看到文件中定義了個(gè)的擴(kuò)展實(shí)現(xiàn)。 摘要: 在Dubbo的官網(wǎng)上,Dubbo描述自己是一個(gè)高性能的RPC框架。今天我想聊聊Dubbo的另一個(gè)很棒的特性, 就是它的可擴(kuò)展性。 Dubbo的擴(kuò)展機(jī)制 在Dub...
摘要:二注解該注解為了保證在內(nèi)部調(diào)用具體實(shí)現(xiàn)的時(shí)候不是硬編碼來指定引用哪個(gè)實(shí)現(xiàn),也就是為了適配一個(gè)接口的多種實(shí)現(xiàn),這樣做符合模塊接口設(shè)計(jì)的可插拔原則,也增加了整個(gè)框架的靈活性,該注解也實(shí)現(xiàn)了擴(kuò)展點(diǎn)自動(dòng)裝配的特性。 Dubbo擴(kuò)展機(jī)制SPI 前一篇文章《dubbo源碼解析(一)Hello,Dubbo》是對(duì)dubbo整個(gè)項(xiàng)目大體的介紹,而從這篇文章開始,我將會(huì)從源碼來解讀dubbo再各個(gè)模塊的實(shí)...
摘要:簡介全稱為,是一種服務(wù)發(fā)現(xiàn)機(jī)制。的本質(zhì)是將接口實(shí)現(xiàn)類的全限定名配置在文件中,并由服務(wù)加載器讀取配置文件,加載實(shí)現(xiàn)類。不過,并未使用原生的機(jī)制,而是對(duì)其進(jìn)行了增強(qiáng),使其能夠更好的滿足需求。并未使用,而是重新實(shí)現(xiàn)了一套功能更強(qiáng)的機(jī)制。 1、SPI簡介 SPI 全稱為 Service Provider Interface,是一種服務(wù)發(fā)現(xiàn)機(jī)制。SPI 的本質(zhì)是將接口實(shí)現(xiàn)類的全限定名配置在文件中...
摘要:要構(gòu)建自適應(yīng)實(shí)例,先要有自適應(yīng)的實(shí)現(xiàn)類,實(shí)現(xiàn)類有兩種方式一種通過配置文件,一種是通過是字節(jié)碼的方式動(dòng)態(tài)生成。 SPI機(jī)制 SPI,即(service provider interface)機(jī)制,有很多組件的實(shí)現(xiàn),如日志、數(shù)據(jù)庫訪問等都是采用這樣的方式,一般通用組件為了提升可擴(kuò)展性,基于接口編程,將操作接口形成標(biāo)準(zhǔn)規(guī)范,但是可以開放多種擴(kuò)展實(shí)現(xiàn),這種做法也符合開閉設(shè)計(jì)原則,使組件具有可插...
摘要:在中配置,以配置為例整個(gè),最先使用的地方從里面讀取這個(gè)配置使用接口的中獲取具體的實(shí)現(xiàn)類中有兩個(gè)值當(dāng)主線程被外部終止時(shí),會(huì)觸發(fā),執(zhí)行的與方法通知下面的鎖操作,主線程正常走完代碼,并最終停止。 spring是如何啟動(dòng)容器的 常見的一種在本地使用main方法啟動(dòng)spring的方法 public static void main(String[] args) throws Except...
閱讀 5538·2021-10-15 09:42
閱讀 1685·2021-09-22 16:05
閱讀 3348·2021-09-22 15:57
閱讀 3558·2019-12-27 12:06
閱讀 1035·2019-08-29 15:16
閱讀 2951·2019-08-26 12:24
閱讀 448·2019-08-26 12:02
閱讀 1953·2019-08-23 16:00