dubbo 知识点

1 三种扩展点注解作用是什么,有什么区别(@SPI, @Adaptive, @Activate),分别用于什么场景?

1.1 @SPI注解可以使用在类,接口和枚举类上,dubbo框架中都是使用在接口上。

主要作用是相当于一个扩展点,可以有多个不同的实现。运行时通过配置找到具体的实现类。

1.2 @Adaptive 可以标记在类,接口,枚举类和方法上。

在dubbo中主要是用在接口的方法上,直到扩展点方法执行时才决定调用是一个扩展点实现。

1.3 @Activate 可以标记在类,接口,枚举类和方法上。

主要使用在有多个扩展点实现,需要根据不同条件被激活的场景中,如fileter需要多个同时激活,因为每个filter实现的是不同功能。

2 @Adaptive扩展点注释在类上和注释在方法上有什么区别,分别是如何实现的?

2.1 如果标注在方法上,则可以通过参数动态获得实现类。(方法级别注解在第一次getExtension时,会自动生成和编译一个动态的Adaptive类,从而达到动态实现类的效果)

2.2如果标注在类上,则整个实现类会直接作为默认实现。主要是为了直接固定对应的实现而不需要动态生成代码实现。

在代码中,会缓存两个与@Adaptive有关的对象,一个缓存在cachedAdaptiveClass中,即Adaptive具体实现类的Class类型,另一个缓存在cachedAdaptiveInstance中,即Class的具体实例化对象。在扩展点初始化的时候,如果发现实现类有@Adaptive注解,则直接赋值给cachedAdaptiveClass,后续实例化类的时候,就不会在动态生成代码,直接实例化并缓存到cachedAdaptiveInstance中。如果注解在接口方法上,则会根据参数,动态获得扩展点的实现,会生成Adaptive类,再缓存到cachedAdaptiveInstance中。

// ExtensionLoader

private final HoldercachedAdaptiveInstance =new Holder();

private volatile ClasscachedAdaptiveClass =null;


参考 ExtensionLoader的方法 getAdaptiveExtension()

3 注册中心接口有多个实现类,dubbo是怎么知道默认用哪个实现类?

RegistryFactory工厂类通过@Adaptive({"protocol"}) 注解动态查找注册中心实现,根据URL中的protocol参数动态选择对应的注册中心工厂,并初始化具体的注册中心客户端。

你可能感兴趣的:(dubbo 知识点)