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