摘要:為了實(shí)現(xiàn)在模塊裝配的時(shí)候,不在模塊里寫(xiě)死代碼,就需要一種服務(wù)發(fā)現(xiàn)機(jī)制。就提供了這樣一種機(jī)制為某個(gè)接口尋找服務(wù)實(shí)現(xiàn),有點(diǎn)類(lèi)似思想,將裝配的控制權(quán)移到代碼之外。即接口文件的全類(lèi)名。五示例遵循上述第一條第點(diǎn),這里為接口文件,其中和為兩個(gè)實(shí)現(xiàn)類(lèi)。
一、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)類(lèi)進(jìn)行硬編碼。一旦代碼里涉及具體的實(shí)現(xiàn)類(lèi),就違反了可插拔的原則,如果需要替換一種實(shí)現(xiàn),就需要修改代碼。為了實(shí)現(xiàn)在模塊裝配的時(shí)候,不在模塊里寫(xiě)死代碼,就需要一種服務(wù)發(fā)現(xiàn)機(jī)制。Java SPI就提供了這樣一種機(jī)制:為某個(gè)接口尋找服務(wù)實(shí)現(xiàn),有點(diǎn)類(lèi)似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)類(lèi)的全類(lèi)名。
三、Dubbo為什么不采用JDK的SPIJDK標(biāo)準(zhǔn)的SPI會(huì)一次性實(shí)例化擴(kuò)展點(diǎn)所有實(shí)現(xiàn),如果有擴(kuò)展實(shí)現(xiàn)初始化很耗時(shí)。但如果沒(méi)用上也加載,會(huì)很浪費(fèi)資源。針對(duì)這個(gè)問(wèn)題,Dubbo增加了對(duì)擴(kuò)展點(diǎn)IoC和AOP的支持,一個(gè)擴(kuò)展點(diǎn)可以直接setter注入其它擴(kuò)展點(diǎn)。
四、Dubbo SPI的默認(rèn)約定1.spi 文件存儲(chǔ)路徑在META-INFdubbointernal 目錄下并且文件名為接口的全路徑名。即接口文件的全類(lèi)名。
2.每個(gè)spi 文件里面的格式定義為: 擴(kuò)展名=具體的類(lèi)名,例如 dubbo=com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtoco。使用時(shí)通過(guò)key加載(如dubbo),可以實(shí)現(xiàn)部分加載。
五、SPI示例
遵循上述第一條第2點(diǎn),這里Command為接口文件,其中StartCommand和ShutdownCommand為兩個(gè)實(shí)現(xiàn)類(lèi)。需要在resources目錄下建META-INF子目錄,在META-INF下建services目錄,然后以接口全路徑作為文件名創(chuàng)建文件,內(nèi)容為接口實(shí)現(xiàn)類(lèi)的全類(lèi)型名。
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類(lèi):
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://www.ezyhdfw.cn/yun/68501.html
摘要:今天我想聊聊的另一個(gè)很棒的特性就是它的可擴(kuò)展性。的擴(kuò)展機(jī)制在的官網(wǎng)上,描述自己是一個(gè)高性能的框架。接下來(lái)的章節(jié)中我們會(huì)慢慢揭開(kāi)擴(kuò)展機(jī)制的神秘面紗。擴(kuò)展擴(kuò)展點(diǎn)的實(shí)現(xiàn)類(lèi)。的定義在配置文件中可以看到文件中定義了個(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í)候不是硬編碼來(lái)指定引用哪個(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)目大體的介紹,而從這篇文章開(kāi)始,我將會(huì)從源碼來(lái)解讀dubbo再各個(gè)模塊的實(shí)...
摘要:簡(jiǎn)介全稱(chēng)為,是一種服務(wù)發(fā)現(xiàn)機(jī)制。的本質(zhì)是將接口實(shí)現(xiàn)類(lèi)的全限定名配置在文件中,并由服務(wù)加載器讀取配置文件,加載實(shí)現(xiàn)類(lèi)。不過(guò),并未使用原生的機(jī)制,而是對(duì)其進(jìn)行了增強(qiáng),使其能夠更好的滿足需求。并未使用,而是重新實(shí)現(xiàn)了一套功能更強(qiáng)的機(jī)制。 1、SPI簡(jiǎn)介 SPI 全稱(chēng)為 Service Provider Interface,是一種服務(wù)發(fā)現(xiàn)機(jī)制。SPI 的本質(zhì)是將接口實(shí)現(xiàn)類(lèi)的全限定名配置在文件中...
摘要:要構(gòu)建自適應(yīng)實(shí)例,先要有自適應(yīng)的實(shí)現(xiàn)類(lèi),實(shí)現(xiàn)類(lèi)有兩種方式一種通過(guò)配置文件,一種是通過(guò)是字節(jié)碼的方式動(dòng)態(tài)生成。 SPI機(jī)制 SPI,即(service provider interface)機(jī)制,有很多組件的實(shí)現(xiàn),如日志、數(shù)據(jù)庫(kù)訪問(wèn)等都是采用這樣的方式,一般通用組件為了提升可擴(kuò)展性,基于接口編程,將操作接口形成標(biāo)準(zhǔn)規(guī)范,但是可以開(kāi)放多種擴(kuò)展實(shí)現(xiàn),這種做法也符合開(kāi)閉設(shè)計(jì)原則,使組件具有可插...
摘要:在中配置,以配置為例整個(gè),最先使用的地方從里面讀取這個(gè)配置使用接口的中獲取具體的實(shí)現(xiàn)類(lèi)中有兩個(gè)值當(dāng)主線程被外部終止時(shí),會(huì)觸發(fā),執(zhí)行的與方法通知下面的鎖操作,主線程正常走完代碼,并最終停止。 spring是如何啟動(dòng)容器的 常見(jiàn)的一種在本地使用main方法啟動(dòng)spring的方法 public static void main(String[] args) throws Except...
閱讀 5715·2021-10-15 09:42
閱讀 1765·2021-09-22 16:05
閱讀 3450·2021-09-22 15:57
閱讀 3645·2019-12-27 12:06
閱讀 1113·2019-08-29 15:16
閱讀 3038·2019-08-26 12:24
閱讀 528·2019-08-26 12:02
閱讀 2030·2019-08-23 16:00