为什么要设计Adaptive?注解在类上和注解在方法上的区别?
adaptive设计的目的是为了识别固定已知类和扩展未知类。
注解在类上
代表人工实现,实现一个装饰类(设计模式中的装饰模式),它主要作用于固定已知类,
目前整个系统只有2个,AdaptiveCompiler、AdaptiveExtensionFactory。
- 为什么AdaptiveCompiler这个类是固定已知的?
因为整个框架仅支持Javassist和JdkCompiler。
- 为什么AdaptiveExtensionFactory这个类是固定已知的?
因为整个框架仅支持2个objFactory,一个是SPI,另一个是Spring。
注解在方法上
代表自动生成和编译一个动态的Procotol$Adpative类,它主要是用于SPI,因为SPI的类是不固定、未知的扩展类,所以设计了动态$Adaptive类,然后可以在运行时通过从url中获取协议key获取具体实现类,该代理会调用具体实现类相应方法。
例如 Protocol的SPI类有 injvm dubbo registry filter listener等等 很多扩展未知类,通过下列代码获取代理类Protocol$Adaptive
1 | Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension(); |
在代理类中再通过从url中获取的协议名获取具体实现类,让代理来调用。
1 | ExtensionLoader.getExtensionLoader(Protocol.class).getExtension(extName); |
@Adaptive注解源码
1 | @Documented |