dubbo
2021-12-26 15:41:10 0 举报
dubbo源码分析
作者其他创作
大纲/内容
获取实现类上的@SPI(value='red')中的值作为默认值cachedDefaultName
if (cachedAdaptiveClass == null)
是否为wrapper包装类如果是的话就把clazz添加到cachedWrapperClasses集合中
Class clazz = getExtensionClasses().get(name);
// 获取当前接口的所有扩展类 getExtensionClasses();
获取所有配置文件中的扩展类
generate方法中会生成一下代码块
方法上存在Adaptive注解才进行代理Adaptive adaptiveAnnotation = method.getAnnotation(Adaptive.class);
createAdaptiveExtensionClass()
\"true\".equals(name)
cachedWrapperClasses有值的话
代理对象调用代理对象中的方法时就会执行这段代码块
getAdaptiveExtension的instance = createAdaptiveExtension();方法
injectExtension((T) getAdaptiveExtensionClass().newInstance());
newInstance()会执行构成函数的方法
getDefaultExtension()
instance = createAdaptiveExtension();
SpiExtensionFactory
instance = createExtension(name); // 创建扩展点对象
是否有Adaptive注解cacheAdaptiveClass(clazz);cachedAdaptiveClass=clazz
创建ExtensionLoader<Person.class>时创建一个objectFactory
通过ClassLoader classLoader = findClassLoader();获取类加载器,然后调用编译器的compile方法编译并加载generate返回的代码块
包装类
判断type是否为接口并且加@SPI注解
获取到clazz后放到EXTENSION_INSTANCES集合中
ExtensionLoader<Person> extensionLoader = ExtensionLoader.getExtensionLoader(Person.class);通过这个方法获取person的扩展类加载器并存放到EXTENSION_LOADERS参数中
SpringExtensionFactory
// 依赖注入injectExtension(instance);
如果某个接口没有手动指定一个Adaptive类,那么就自动生成一个Adaptive类
getAdaptiveExtensionClass
classes = loadExtensionClasses(); // 加载、解析文件 Map
获取到cachedDefaultName后再次调用getExtension(name)方法
// cache接口默认的扩展类 cacheDefaultExtensionName();
generate()方法生成的代理对象的代码块创建接口的代理对象代码package com.dubbo;import org.apache.dubbo.common.extension.ExtensionLoader;public class Car$Adaptive implements com.dubbo.Car { public java.lang.String getCarName(com.dubbo.UrlParams arg0) { if (arg0 == null) throw new IllegalArgumentException(\"com.dubbo.UrlParams argument == null\"); if (arg0.getUrl() == null) throw new IllegalArgumentException(\"com.dubbo.UrlParams argument getUrl() == null\"); org.apache.dubbo.common.URL url = arg0.getUrl(); String extName = url.getParameter(\"car\"); if(extName == null) throw new IllegalStateException(\"Failed to get extension (com.dubbo.Car) name from url (\" + url.toString() + \") use keys([car])\"); com.dubbo.Car extension = (com.dubbo.Car)ExtensionLoader.getExtensionLoader(com.dubbo.Car.class).getExtension(extName); return extension.getCarName(arg0); }}
// 缓存了@Adaptive注解标记的类if (cachedAdaptiveClass != null) {return cachedAdaptiveClass;}
generateMethodContent
调用getAdaptiveExtensionClass()获取class对象
generateMethod
extensionLoader.getExtension(name);
loadDirectory()加载配置文件
0 条评论
回复 删除
下一页