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参数动态选择对应的注册中心工厂,并初始化具体的注册中心客户端。










网友评论