解析:ExtensionLoader.getExtensionLoader
2020-04-15 17:53:59 1 举报
ExtensionLoader
作者其他创作
大纲/内容
4⃣️检查方法参数中是否有com.alibaba.dubbo.rpc.Invocation类型,有则调用其getMethodName方法
2⃣️//遍历每个文件URL,加载资源loadResource()
调用该类的构造器,初始化
1⃣️生成适应性扩展类的源码createAdaptiveExtensionClassCode()
解析:ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension()
1⃣️//扫描该ExtensionLoader负责的所有扩展类ExtensionClass getExtensionClasses()顺路赋值cachedAdaptiveClass,并返回
1⃣️根据type生成完整的路径+文件名,通过类加载器讲文件描述为Enumeration<java.net.URL>
1⃣️ExtensionLoader的ExtensionFactory不为空时,遍历扩展类实例的所有set方法也就是加载该实例依赖的其他扩展
//获取扩展类加载器ExtensionLoader.getExtensionLoader(Class type)
1⃣️//获取适应性扩展classgetAdaptiveExtensionClass()
2⃣️扫描所有指定路径即扩展点配置文件所在路径\"META-INF/dubbo/internal/\"\"META-INF/dubbo/\"META-INF/services/\"//扫描加载路径下的资源loadDirectory()
2⃣️该类为扩展点包装类WrapperClass,将其添加到cachedWrapperClasses缓存set中
2⃣️ExtensionFactory为空时,不做处理。也就是,ExtensionFactory类型的扩展不需要自动注入其他依赖。
1⃣️判断参数类- 是否存在- 是否是接口类型- 是否带有@SPI扩展点注解
3⃣️通过dubbo的compiler编译前面生成的源码dubbo.application.compiler可以自定义
2⃣️带有@Adaptive的方法,检查方法参数
2⃣️若无,检查方法参数类型中是否有get方法能够返回URL类型对象
//获取适应性扩展ExtensionLoader.getAdaptiveExtension()
7⃣️组装前面生成的源码字符串
1⃣️验证type拥有@SPI注解,且SPI注解的value值不多于一个
3⃣️空指针检查,并拿到URL对象
2⃣️符合则new一个实例
1⃣️检查方法参数中是否有URL类型
2⃣️//根据value反射生成对应的class,开始为ExtensionLoader执行转载过程loadClass()
3⃣️获取方法上@Adaptive注释的value值(字符串数组),若为空,则通过type的类名自动生成该字符串
2⃣️获得dubbo的Compiler的适应性扩展类ExtensionLoader.getExtensionLoader(Compiler.class).getAdaptiveExtension()
2⃣️//否则,创建适应性扩展ExtensionLoader.createAdaptiveExtension
2⃣️反射生成适应性扩展实例
1⃣️检验该扩展点实现类class是否为type的子类
1⃣️通过BufferedReader读入键值对,key为扩展点类型缩写,value为完整扩展点实现类型类名
6⃣️调用扩展类执行该方法
2⃣️//扫描加载loadExtensionClasses()
2⃣️赋值cachedAdaptiveClass失败,动态创建适应性扩展类createAdaptiveExtensionClass()然后赋值返回
1⃣️不带有@Adaptive注释的方法,方法体为抛异常
2⃣️按条件装载该class
3⃣️//为该实例注入以来的属性值injectExtension(T instance)
1⃣️该class带有@Adaptive注释,将其赋值于cachedAdaptiveClass
1⃣️查看实例cachedAdaptiveInstance是否存在,在则返回
0 条评论
下一页