dubbo源码分析之getExtension

官方解读:返回指定名字的扩展。如果指定名字的扩展不存在,则抛异常 {@link IllegalStateException}.

我理解的此类主要用作adaptive自动适配的时候,根据url的type获取实现的扩展点。

getExtension方法的主要思路是
-->.从cachedInstances缓存中获取,有则返回
-->缓存中没有则调用 createExtension(name);
--> createExtension(name)方法做了两件特别重要的事情
-->dubbo的ioc(injectExtension)ioc注入也是依赖ExtensionLoader
-->dubbo的aop,a.从当前spi实例cachedWrapperClasses缓存中获取,在执行
getExtensionClasses() 中的
loadExtensionClasses()中
loadFile()时,将wrapper类装到了实例的cachedWrapperClasses缓存set集合中
b.构造wrapper,并且注入wrapper的依赖
-->将返回的实例放入cachedInstances

给出 createExtension(name)代码

需要注意的点:1。weapper保留spi类型的构造函数
2。getExtension返回的不一定就是spi的具体实现类,可能是经过包装的类,具体返回依据是cachedWrapperClasses缓存内有没有值。

猜你喜欢

转载自blog.csdn.net/yangxiaobo118/article/details/80717993