dubbo
dubbo copied to clipboard
`@Adaptive`注解标注在类上有什么特别之处?
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注解标注在类上有什么特别之处?
dubbo的扩展点,一般是注解在方法上,根据url获取扩展信息,背后就是通过javassist动态生成代码并编译加载,如果是注解在类上的话,表明此扩展点为静态扩展,逻辑就在当前代码里
我的理解是,使用@Adaptive标注类而非通过getExtension指定类有以下好处:
- 自定义扩展:像
AdaptiveExtensionInjector、AdaptiveCompiler这些使用@Adaptive标注的类,其内部并没有实现具体的业务逻辑,而是通过一些逻辑调用其他的拓展类,可以满足一些通过方法标注@Adaptive不能实现的拓展逻辑。 - 方便理解调用:使用
@Adaptive标注类可以让人知道这是静态拓展,约定俗成。而直接指定拓展类则无这层语义。