`
jishuaige
  • 浏览: 10311 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

dubbo-探索之旅(三)---ExtensionFactory

阅读更多
  上一节比较全面的了解了dubbo里面是怎么对JAVA的SPI机制进行扩展的。理解了这个很重要,因为dubbo里面很多的实现都和扩展SPI机制有关。比如今天我看的ExtensionFactory


  上一节谈到ExtensionLoader在加载扩展实现的时候内部实现了个简单的ioc机制,来实现对扩展实现所依赖的参数的注入。对扩展实现中公有的set方法且入参个数为一个的方法,尝试从工厂中获取值注入到扩展实现中去。来实现动态注入,这个工厂就是我们的ExtensionFactory对象。

ExtensionFactory类关系如下:




AdaptiveExtensionFactory类,一个适配类(被@Adaptive修饰)。它包含了ExtensionFactory所有的实现类。dubbo默认:
spring=com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory
adaptive=com.alibaba.dubbo.common.extension.factory.AdaptiveExtensionFactory
spi=com.alibaba.dubbo.common.extension.factory.SpiExtensionFactory

工厂的默认实现类是:SpringExtensionFactory和SpiExtensionFactory

SpiExtensionFactory类
根据Class<T> type参数获取扩展点的适配类。
public class SpiExtensionFactory implements ExtensionFactory {

    public <T> T getExtension(Class<T> type, String name) {
        if (type.isInterface() && type.isAnnotationPresent(SPI.class)) {
            ExtensionLoader<T> loader = ExtensionLoader.getExtensionLoader(type);
            if (loader.getSupportedExtensions().size() > 0) {
                return loader.getAdaptiveExtension();
            }
        }
        return null;
    }

}


SpringExtensionFactory类
public class SpringExtensionFactory implements ExtensionFactory {
    
    private static final Set<ApplicationContext> contexts = new ConcurrentHashSet<ApplicationContext>();
    
    public static void addApplicationContext(ApplicationContext context) {
        contexts.add(context);
    }

    public static void removeApplicationContext(ApplicationContext context) {
        contexts.remove(context);
    }

    @SuppressWarnings("unchecked")
    public <T> T getExtension(Class<T> type, String name) {
        for (ApplicationContext context : contexts) {
            if (context.containsBean(name)) {
                Object bean = context.getBean(name);
                if (type.isInstance(bean)) {
                    return (T) bean;
                }
            }
        }
        return null;
    }

}


和Spring结合,在Spring容器中去获取。后面专门研究一个dubbo的spring结合

AdaptiveExtensionFactory类:
适配类的getExtension(Class<T> type, String name)方法,调用每个Factory类的getExtension方法来获取扩展点对象。
@Adaptive
public class AdaptiveExtensionFactory implements ExtensionFactory {
    
    private final List<ExtensionFactory> factories;
    
    public AdaptiveExtensionFactory() {
        ExtensionLoader<ExtensionFactory> loader = ExtensionLoader.getExtensionLoader(ExtensionFactory.class);
        List<ExtensionFactory> list = new ArrayList<ExtensionFactory>();
        for (String name : loader.getSupportedExtensions()) {//保存所有ExtensionFactory的实现
            list.add(loader.getExtension(name));
        }
        factories = Collections.unmodifiableList(list);
    }

    public <T> T getExtension(Class<T> type, String name) {
        // 依次遍历各个ExtensionFactory实现的getExtension方法,一旦获取到Extension即返回
        // 如果遍历完所有的ExtensionFactory实现均无法找到Extension,则返回null
        for (ExtensionFactory factory : factories) {
            T extension = factory.getExtension(type, name);
            if (extension != null) {
                return extension;
            }
        }
        return null;
    }

}


现在回过头来看ExtensionLoader类中的injectExtension方法中的这句代码:
Object object = objectFactory.getExtension(pt, property);获取property对应的实现类。通过: method.invoke(instance, object);实现动态注入。


下一节,我想看看Compiler
  • 大小: 31.2 KB
分享到:
评论

相关推荐

    dubbo-admin-2.5.4及dubbo-monitor-2.5.3 安装及配置

    dubbo-admin安装要点: 1.清空tomcat/webapps/ROOT目录 2.将包解压到tomcat/webapps/ROOT下 3.修改tomcat/webapps/ROOT/WEB-INF/dubbo.properties 文件 dubbo.registry.address dubbo接口服务注册地址: 单机...

    dubbo-dubbo-2.7.3.rar

    dubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo-2.7.3.rardubbo源码dubbo-dubbo...

    dubbo-admin-2.5.4.war

    【标题】"dubbo-admin-2.5.4.war" 指的是 Dubbo 提供的一款基于 Web 的管理控制台应用,版本为 2.5.4。这个 WAR 文件是一种打包好的 Java Web 应用程序,可以在支持 Java Servlet 的容器(如 Apache Tomcat)上部署...

    dubbo-admin的下载

    【标题】"dubbo-admin的下载" 在分布式系统开发中,Dubbo是一个广泛使用的高性能Java RPC框架,由阿里巴巴开源。而dubbo-admin是Dubbo框架的一部分,它提供了一个管理控制台,允许开发者监控和管理服务的运行状态,...

    dubbo-demo-consumer、dubbo-demo-provider、dubbo-simple-monitor

    本篇将详细讲解基于dubbo-demo-consumer、dubbo-demo-provider和dubbo-simple-monitor的实例服务,带你深入理解Dubbo的核心概念和操作流程。 首先,我们来看`dubbo-demo-consumer`,它是Dubbo服务的消费者。消费者...

    incubator-dubbo-dubbo-2.5.8

    【标题】"incubator-dubbo-dubbo-2.5.8" 是一个基于Java的开源服务框架,由Apache孵化器项目提供。这个版本是Dubbo的2.5.8稳定版,它包含了Dubbo的核心服务治理功能以及一个专门的管理平台——dubbo-admin。 【描述...

    dubbo-admin包

    【标题】"dubbo-admin包"是Dubbo框架的一个重要组成部分,主要用作服务治理的管理界面。这个压缩包包含了运行Dubbo管理控制台所需的所有文件,使得开发者和运维人员可以方便地监控、管理和配置Dubbo服务。 【描述】...

    dobbo源码dubbo-dubbo-2.7.3.rar

    dobbo源码dubbo-dubbo-2.7.3.rardobbo源码dubbo-dubbo-2.7.3.rardobbo源码dubbo-dubbo-2.7.3.rardobbo源码dubbo-dubbo-2.7.3.rardobbo源码dubbo-dubbo-2.7.3.rardobbo源码dubbo-dubbo-2.7.3.rardobbo源码dubbo-dubbo...

    incubator-dubbo-ops-master.rar

    《Apache Incubator Dubbo-OPS Master:深度解析与实践》 Apache Incubator Dubbo-OPS Master 是一套由Dubbo社区开发的管理工具,旨在为Dubbo服务提供全面的运营管理和监控支持。Dubbo,作为一款高性能、轻量级的...

    dubbo-admin-2.5.4.war后台管理

    其中,`dubbo-admin`是Dubbo的核心组件之一,它提供了一个可视化的管理控制台,帮助开发者对服务进行管理和监控。本文将详细解析`dubbo-admin-2.5.4.war`这个版本的后台管理工具,探讨其主要特性和使用方法。 首先...

    incubator-dubbo-dubbo-2.6.1

    【标题】"incubator-dubbo-dubbo-2.6.1" 是一个Apache Incubator项目Dubbo的特定版本,这里的2.6.1表示该版本是Dubbo的稳定分支之一。 【描述】提到的"incubator-dubbo-dubbo-2.6.1"表明这是Apache孵化器中的Dubbo...

    jmeter-plugins-dubbo-2.7.8-jar-with-dependencies.jar

    jmeter的dubbo插件,jmeter-plugins-dubbo-2.7.8-jar-with-dependencies.jar,适用于JMeter5.4.1版本,将解压后的文件jmeter-plugins-dubbo-2.7.8-jar-with-dependencies放在Jmeter安装目录下的\lib\ext文件夹中,...

    dubbo-monitor-simple-2.5.8-assembly.tar.gz

    《Dubbo监控工具详解——基于dubbo-monitor-simple-2.5.8》 在分布式系统开发中,监控是至关重要的一个环节,它可以帮助开发者实时了解服务的运行状态,及时发现并解决问题。Apache Dubbo,作为一款高性能、轻量级...

    dubbo-admin-2.5.5.war

    dubbo-admin打包后的文件,扔到tomcat里就能跑起来!dubbo-admin打包后的文件,扔到tomcat里就能跑起来!dubbo-admin打包后的文件,扔到tomcat里就能跑起来!

    dubbo-admin包,dubbo-admin.war,基于github中dubbo源码打包,亲测可用。

    【标题】"dubbo-admin包"是Dubbo项目的一个重要组成部分,主要提供了管理控制台的功能。这个特定的版本,"dubbo-admin.war",是根据GitHub上的Dubbo源代码编译并打包而成的,确保了其与最新的开发成果同步,并且已经...

    jmeter-plugins-dubbo-2.7.1-jar-with-dependencies

    本文将深入探讨“jmeter-plugins-dubbo-2.7.1-jar-with-dependencies”这一系统压测工具包,它专门针对基于Java的Dubbo服务进行性能测试。了解并熟练掌握这一工具,能帮助我们更好地优化服务性能,提升系统的稳定性...

    dubbo-monitor-simple-2.6.1.tgz

    dubbo官方自带了dubbo-admin及dubbo-simple/dubbo-monitor-simple二个子项目用于服务治理及服务监控。 dubbo-monitor-simple是Alibaba的开源项目,用于监控在dubbo框架下接口暴露,注册情况,也可以看接口的调用...

    dubbo-admin dubbo-monitor.zip 2.8.4可用

    【标题】"dubbo-admin dubbo-monitor.zip 2.8.4可用" 指的是一个包含Dubbo管理工具和监控模块的压缩包文件,版本为2.8.4,适用于Dubbo框架的管理和监控需求。 【描述】"dubbo-admin.zip dubbo-monitor.zip; 包含 ...

    dubbo-admin-2.6.0下载

    【标题】"dubbo-admin-2.6.0下载"涉及的是Dubbo管理控制台的2.6.0版本,这是一个用于监控和管理Dubbo服务的重要工具。Dubbo是阿里巴巴开源的一款高性能、轻量级的Java远程服务调用框架,它提供服务治理、监控等能力...

Global site tag (gtag.js) - Google Analytics