Dubbo 源碼分析html
實現了本身的SPI,爲何不用java默認的spi機制?java
1.由於java spi機制必須一次性加載全部配置信息,全部的擴展實現類都加載,無論是否用到。spring
dubbo擴展文件中是經過key=類全名來指定具體實現類,實現加載指定的實現類緩存
2.由於java spi機制不支持對擴展實現類進行IOC,AOP操做。app
------------------------------------------------------------------------------源碼分析
Dubbo SPI 目的得到一個實現類的對象。this
途徑:ExtensionLoader.getExtension(String name).net
實現路徑:代理
getExtensionLoader(Class<T> type)就是爲接口直接new一個ExtensionLoader,而後緩存起來server
getAdaptiveExtension() 得到一個擴展裝飾類的對象,這個類有一個規則,若是它沒有@Adaptive註解,就動態建立一個裝飾類,例如Protocol$Adaptive對象.
getExtension(String name) 獲取一個對象。
-----------------ExtensionLoader.getExtensionLoader(Class<T> type)-------------------
ExtensionLoader.getExtensionLoader(Container.class)
-->new ExtensionLoader(Container.class)
-->this.type = Container.class
-->objectFactory=ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension()
執行上面的代碼完成了2個屬性的初始化
1.每一個ExtensionLoader都包含2個值 type 和objectFactory
Class<?> type://構造器初始化時要獲得的接口名
ExtensionFactory objectFactory//構造器初始化時AdaptiveExtensionFactory[SpiExtensionFactory,SpringExtensionFactory]
2.new 一個ExtensionLoader存儲在ConcurrentMap<Class<?>, ExtensionLoader<?>> EXTENSION_LOADERS
關於這個objectFactory的一些細節:
1.objectFactory就是ExtensionFactory,它也是經過ExtensionLoader.getExtensionLoader(ExtensionFactory.class)類實現的,可是它的objectFactory是null
2.objectFactory的做用,是爲dubbo的IOC提供全部對象。
------------------------------------------------------------------------------
proxyFactory:是爲了獲取一個接口的代理類。例如獲取一個遠程接口的代理。
它有兩個方法,表明2個做用:
a.getInvoker:針對server端。將服務對象如DemoServiceImpl包裝成一個Invoker對象。
b.getProxy :針對client端。建立接口的代理對象。例如DemoService的接口。
Wrapper:它相似spring的BeanWrapper,它就是包裝類一個接口或一個類,能夠經過Wrapper對實例對象進行賦值,取值以及制定方法的調用
Invoker:是一個能夠執行的對象。可以根據方法的名稱,參數獲得相應的執行結果。
它有個很重要的方法Result invoker(Invocation invocation)
Invocation是包含類須要執行的方法和參數等重要信息,目前它有2個實現類RpcInvocation MockInvocation
它有3中類型的Invoker
1.本地執行類的Invoker
2.遠程通訊類的Invoker
3.多個遠程通訊執行類的Invoker聚合成集羣版的Invoker
Protocol
1.export:暴露遠程服務(用於服務端),就是將proxyFactory.getInvoker建立的代理類invoker對象。經過協議暴露給外部。
2.refer:引用遠程服務(用戶客戶端),經過proxyFactory.getProxy來建立遠程的動態代理類,例如建立DemoService的遠程動態接口
exporter:維護invoker的生命週期。
http://www.cnblogs.com/java-zhao/category/1090034.html
http://zhaoshijie.iteye.com/blog/2090049#bc2398159
http://blog.csdn.net/u010311445/article/category/2745121
http://blog.csdn.net/MrZhangXL/article/category/7039221
http://blog.csdn.net/akfly/article/details/53740894