dubbo扩展类的初始化

本文深入探讨了Dubbo的SPI扩展类初始化过程,包括ExtensionLoader对象的内部存储结构,各类SPI加载顺序,以及重点讲解了适配器模式和自适应扩展机制。文章还提到了扩展类工厂、编译器以及其他普通扩展类的加载,并分析了dubbo.filter的包装类型实现。总结指出,Dubbo SPI是其核心机制,自适应扩展机制对于理解和使用Dubbo至关重要。
摘要由CSDN通过智能技术生成

SPI 全称为 Service Provider Interface,是一种服务发现机制。具体解释参考Dubbo官方文档的Dubbo SPI,这里面对JAVA SPIDubbo自己的SPI讲解非常清楚。这边谈一谈Dubbo初始化时的一些细节。

dubbo有哪些扩展类?

找到源码包中的/META-INF/dubbo/internal目录,会看到一堆SPI的配置。具体可以逐个翻开看看。

com.alibaba.dubbo.cache.CacheFactory
com.alibaba.dubbo.common.compiler.Compiler
com.alibaba.dubbo.common.extension.ExtensionFactory
com.alibaba.dubbo.common.logger.LoggerAdapter
com.alibaba.dubbo.common.serialize.Serialization
com.alibaba.dubbo.common.status.StatusChecker
com.alibaba.dubbo.common.store.DataStore
com.alibaba.dubbo.common.threadpool.ThreadPool
com.alibaba.dubbo.container.Container
com.alibaba.dubbo.monitor.MonitorFactory
com.alibaba.dubbo.qos.command.BaseCommand
com.alibaba.dubbo.registry.RegistryFactory
com.alibaba.dubbo.remoting.Codec2
com.alibaba.dubbo.remoting.Dispatcher
com.alibaba.dubbo.remoting.exchange.Exchanger
com.alibaba.dubbo.remoting.http.HttpBinder
com.alibaba.dubbo.remoting.p2p.Networker
com.alibaba.dubbo.remoting.telnet.TelnetHandler
com.alibaba.dubbo.remoting.Transporter
com.alibaba.dubbo.remoting.zookeeper.ZookeeperTransporter
com.alibaba.dubbo.rpc.cluster.Cluster
com.alibaba.dubbo.rpc.cluster.ConfiguratorFactory
com.alibaba.dubbo.rpc.cluster.LoadBalance
com.alibaba.dubbo.rpc.cluster.Merger
com.alibaba.dubbo.rpc.cluster.RouterFactory
com.alibaba.dubbo.rpc.Filter
com.alibaba.dubbo.rpc.InvokerListener
com.alibaba.dubbo.rpc.Protocol
com.alibaba.dubbo.rpc.protocol.thrift.ClassNameGenerator
com.alibaba.dubbo.rpc.ProxyFactory
com.alibaba.dubbo.validation.Validation

翻开后会发现一个奇怪的问题,每种类型的KV都配置的3遍。我也很好奇这是为啥?

ExtensionLoader对象中存储了啥?

我把ExtensionLoader类中总览性的一些代码贴出来详细说明。并且配上详细的注释。

public class ExtensionLoader<T> {
   
		// 放置自定义扩展的配置目录
    private static final String SERVICES_DIRECTORY = "META-INF/services/";
		
  	// 放置自定义扩展的配置目录
    private static final String DUBBO_DIRECTORY = "META-INF/dubbo/";
		
  	// 放置内定扩展的配置目录
    private static final String DUBBO_INTERNAL_DIRECTORY = DUBBO_DIRECTORY + "internal/";
		
  	// key:扩展类的抽象类型的class(接口),value:扩展类型对应的扩展类加载器
  	// 比如:(Protocol.class, ExtensionLoader实例)
    private static final ConcurrentMap<Class<?>, ExtensionLoader<?>> EXTENSION_LOADERS = new ConcurrentHashMap<Class<?>, ExtensionLoader<?>>();
		
  	// key:扩展类的class(非接口),value:扩展类型对应的具体实例
  	// 比如:(RegistryProtocol.class, RegistryProtocol实例)
    private static final ConcurrentMap<Class<?>, Object> EXTENSION_INSTANCES = new ConcurrentHashMap<Class<?>, Object>();

    // ==============注意:上面全是静态的,所有对象共享,下面都是非静态的,对象私有================
		// 扩展类的抽象类型的class(接口)
  	// 比如:Protocol.class
    private final Class<?> type;
		
  	// 扩展类工厂,为创建的类做字段注入时,会用到。
    private final ExtensionFactory objectFactory;
		
  	// key:扩展类的class(非接口),扩展类名字
  	// 比如:(RegistryProtocol.class, registry)
    private final ConcurrentMap<Class<?>, String> cachedNames = new ConcurrentHashMap<Class<?>, String>();

  	// key:扩展类名字,扩展类的class(非接口)
  	// 比如:(registry, RegistryProtocol.class)
    private final Holder<<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值