dubbo icon indicating copy to clipboard operation
dubbo copied to clipboard

`@Adaptive`注解标注在类上有什么特别之处?

Open 6westboy9 opened this issue 3 years ago • 2 comments

ExtensionLoader(Class<?> type, ExtensionDirector extensionDirector, ScopeModel scopeModel) {
    this.type = type;
    this.extensionDirector = extensionDirector;
    this.extensionPostProcessors = extensionDirector.getExtensionPostProcessors();
    initInstantiationStrategy();
    this.injector = (type == ExtensionInjector.class ? null : 
                     extensionDirector.getExtensionLoader(ExtensionInjector.class).getAdaptiveExtension()); // ①
    this.activateComparator = new ActivateComparator(extensionDirector);
    this.scopeModel = scopeModel;
}

为什么①处不直接使用this.injector = (type == ExtensionInjector.class ? null : extensionDirector.getExtensionLoader(ExtensionInjector.class).getExtension("adaptive"));呢?不太明白@Adaptive注解标注在类上有什么特别之处?

6westboy9 avatar Jul 01 '22 15:07 6westboy9

dubbo的扩展点,一般是注解在方法上,根据url获取扩展信息,背后就是通过javassist动态生成代码并编译加载,如果是注解在类上的话,表明此扩展点为静态扩展,逻辑就在当前代码里

warmonipa avatar Jul 05 '22 01:07 warmonipa

我的理解是,使用@Adaptive标注类而非通过getExtension指定类有以下好处:

  1. 自定义扩展:像AdaptiveExtensionInjectorAdaptiveCompiler这些使用@Adaptive标注的类,其内部并没有实现具体的业务逻辑,而是通过一些逻辑调用其他的拓展类,可以满足一些通过方法标注@Adaptive不能实现的拓展逻辑。
  2. 方便理解调用:使用@Adaptive标注类可以让人知道这是静态拓展,约定俗成。而直接指定拓展类则无这层语义。

Trying-hc avatar Jul 09 '22 02:07 Trying-hc