zoukankan      html  css  js  c++  java
  • @Adaptive注解

    关于@Adaptive注解

    引用dubbo官方文档的一段话:

    ​ Adaptive 可注解在类或方法上。当 Adaptive 注解在类上时,Dubbo 不会为该类生成代理类。注解在方法(接口方法)上时,Dubbo 则会为该方法生成代理逻辑。Adaptive 注解在类上的情况很少,在 Dubbo 中,仅有两个类被 Adaptive 注解了,分别是 AdaptiveCompiler 和 AdaptiveExtensionFactory。此种情况,表示拓展的加载逻辑由人工编码完成。更多时候,Adaptive 是注解在接口方法上的,表示拓展的加载逻辑需由框架自动生成。

    为什么要设计adaptive?注解在类上和注解在方法上的区别?

    ​ adaptive设计的目的是为了识别固定已知类和扩展未知类。

    1. 注解在类上:代表人工实现,实现一个装饰类(设计模式中的装饰模式),它主要作用于固定已知类,

      目前整个系统只有2个, AdaptiveCompiler,AdaptiveExtensionFactory

      • 为什么AdaptiveCompiler这个类是固定已知的?因为整个框架仅支持Javassist和JdkCompiler。
      • 为什么AdaptiveExtensionFactory这个类是固定已知的?因为整个框架仅支持2个objFactory,一个是spi,另一个是spring
    2. 注解在方法上:代表自动生成和编译一个动态的Adpative类,它主要是用于SPI,因为spi的类是不固定、未知的扩展类,所以设计了动态$Adaptive类.
      例如 Protocol的spi类有 injvm dubbo registry filter listener等等 很多扩展未知类,
      它设计了Protocol$Adaptive的类,通过ExtensionLoader.getExtensionLoader(Protocol.class).getExtension(spi类);来提取对象

    一、在接口上

    在接口上,在调用getAdaptiveExtension方法时,直接返回该类(不会去动态生成代理类),然后执行IOC

    二、在方法上

    在方法上会生成代理代理类

    关于createAdaptiveExtensionClassCode方法

    1. 至少有一个方法被@Adaptive修饰

    2. 被@Adaptive修饰得方法得参数 必须满足参数中有一个是URL类型,或者有至少一个参数有一个“公共且非静态的返回URL的无参get方法”

    3. @Adaptive注解中的值这里我叫它value,value可以是一个数组,如果为空的话,vlaue等于接口名小写(例如接口名:per.qiao.A, 那么value=a)

      获取扩展名图如下

    aaa

    这里value表示@Adaptive注解的值(数组)中最后一个value, 如果该数组为空,则value等于接口名小写

    java生成动态类的模板

    java生成动态类的模板

    package <扩展点接口所在包>;
    
    public class <扩展点接口名>$Adpative implements <扩展点接口> {
    
      public <有@Adaptive注解的接口方法>(<方法参数>) {
          if(是否有URL类型方法参数?) 使用该URL参数
          else if(是否有方法类型上有URL属性) 使用该URL属性
          <else 在加载扩展点生成自适应扩展点类时抛异常,即加载扩展点失败!>
    
          if(获取的URL == null) {
              throw new IllegalArgumentException("url == null");
          }
    
           //...获取扩展点名  图解如上
    
           <接口> extension = (接口) ExtensionLoader.getExtensionLoader(接口).getExtension(扩展点名);
           extension.<有@Adaptive注解的接口方法>(<方法参数>)
      }
    
      public <无@Adaptive注解的接口方法>(<方法参数>) {
          throw new UnsupportedOperationException("is not adaptive method!");
      }
    }
    

    小结:

    1. 一个扩展文件内只能有一个扩展类被@Adaptive修饰,而且还需要有其他的初@Adaptive和AOP扩展之外的至少一个其他扩展

    2. @Adaptive如果方在类上,那么cachedAdaptiveClass就等于该类

      Holder

    3. 如果标注在方法上,那么该方法必须有参数为ulr或者参数有返回url的方法,并且会生成动态文件

  • 相关阅读:
    1057. 数零壹(20)
    Docker镜像操作
    Maven 常用操作
    k8s集群搭建(kubadm方式)
    Spring单事务多线程操作引来的问题(Lock wait timeout exceeded; try restarting transaction)
    Centos7 Maven 安装教程
    Centos7 Git安装教程
    Centos7 Docker安装mysql5.7
    Centos7 Docker安装Nginx教程
    SpringBoot启动及配置文件加载原理分析
  • 原文地址:https://www.cnblogs.com/qiaozhuangshi/p/11007026.html
Copyright © 2011-2022 走看看