摘要:為了實現在模塊裝配的時候,不在模塊里寫死代碼,就需要一種服務發現機制。就提供了這樣一種機制為某個接口尋找服務實現,有點類似思想,將裝配的控制權移到代碼之外。即接口文件的全類名。五示例遵循上述第一條第點,這里為接口文件,其中和為兩個實現類。
一、Dubbo內核
Dubbo內核主要包含SPI、AOP、IOC、Compiler。
二、JDK的SPI1.spi的設計目標:
面向對象的設計里,模塊之間是基于接口編程,模塊質檢不對實現類進行硬編碼。一旦代碼里涉及具體的實現類,就違反了可插拔的原則,如果需要替換一種實現,就需要修改代碼。為了實現在模塊裝配的時候,不在模塊里寫死代碼,就需要一種服務發現機制。Java SPI就提供了這樣一種機制:為某個接口尋找服務實現,有點類似IOC思想,將裝配的控制權移到代碼之外。
2.JDK的SPI的默認約定
當服務的提供者提供了一個接口的多種實現時,一般會在jar包的META-INF/services目錄下,創建該接口的同名文件,文件的內容就是該服務接口的具體實現類的全類名。
三、Dubbo為什么不采用JDK的SPIJDK標準的SPI會一次性實例化擴展點所有實現,如果有擴展實現初始化很耗時。但如果沒用上也加載,會很浪費資源。針對這個問題,Dubbo增加了對擴展點IoC和AOP的支持,一個擴展點可以直接setter注入其它擴展點。
四、Dubbo SPI的默認約定1.spi 文件存儲路徑在META-INFdubbointernal 目錄下并且文件名為接口的全路徑名。即接口文件的全類名。
2.每個spi 文件里面的格式定義為: 擴展名=具體的類名,例如 dubbo=com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtoco。使用時通過key加載(如dubbo),可以實現部分加載。
五、SPI示例
遵循上述第一條第2點,這里Command為接口文件,其中StartCommand和ShutdownCommand為兩個實現類。需要在resources目錄下建META-INF子目錄,在META-INF下建services目錄,然后以接口全路徑作為文件名創建文件,內容為接口實現類的全類型名。
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(); } } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68501.html
摘要:今天我想聊聊的另一個很棒的特性就是它的可擴展性。的擴展機制在的官網上,描述自己是一個高性能的框架。接下來的章節中我們會慢慢揭開擴展機制的神秘面紗。擴展擴展點的實現類。的定義在配置文件中可以看到文件中定義了個的擴展實現。 摘要: 在Dubbo的官網上,Dubbo描述自己是一個高性能的RPC框架。今天我想聊聊Dubbo的另一個很棒的特性, 就是它的可擴展性。 Dubbo的擴展機制 在Dub...
摘要:二注解該注解為了保證在內部調用具體實現的時候不是硬編碼來指定引用哪個實現,也就是為了適配一個接口的多種實現,這樣做符合模塊接口設計的可插拔原則,也增加了整個框架的靈活性,該注解也實現了擴展點自動裝配的特性。 Dubbo擴展機制SPI 前一篇文章《dubbo源碼解析(一)Hello,Dubbo》是對dubbo整個項目大體的介紹,而從這篇文章開始,我將會從源碼來解讀dubbo再各個模塊的實...
摘要:要構建自適應實例,先要有自適應的實現類,實現類有兩種方式一種通過配置文件,一種是通過是字節碼的方式動態生成。 SPI機制 SPI,即(service provider interface)機制,有很多組件的實現,如日志、數據庫訪問等都是采用這樣的方式,一般通用組件為了提升可擴展性,基于接口編程,將操作接口形成標準規范,但是可以開放多種擴展實現,這種做法也符合開閉設計原則,使組件具有可插...
摘要:在中配置,以配置為例整個,最先使用的地方從里面讀取這個配置使用接口的中獲取具體的實現類中有兩個值當主線程被外部終止時,會觸發,執行的與方法通知下面的鎖操作,主線程正常走完代碼,并最終停止。 spring是如何啟動容器的 常見的一種在本地使用main方法啟動spring的方法 public static void main(String[] args) throws Except...
閱讀 5201·2021-10-15 09:42
閱讀 1606·2021-09-22 16:05
閱讀 3261·2021-09-22 15:57
閱讀 3396·2019-12-27 12:06
閱讀 967·2019-08-29 15:16
閱讀 2880·2019-08-26 12:24
閱讀 380·2019-08-26 12:02
閱讀 1885·2019-08-23 16:00