SPI注解

作者: 昵称全尼马被注册了 | 来源:发表于2020-01-03 16:09 被阅读0次

接口

@SPI
public interface MyTestRegistry {
    /**
     * 注册服务
     */
    @Adaptive
    String register(URL url);
}

两个实现

@Activate(group = {"GROUP_A", "GROUP_B"}, order = 999)
public class EtcdRegistry implements MyTestRegistry {
    @Override
    public String register(URL url) {
        return "Etcd register already! ";
    }
}
@Activate(group = {"GROUP_B"})
public class ZookeeperRegistry implements MyTestRegistry {
    @Override
    public String register(URL url) {
        return "Zookeeper register already! ";
    }
}

配置

etcd=com..xxx.xxx.xxx.EtcdRegistry
zookeeper=com.xxx.xxx.xxx.ZookeeperRegistry

测试函数

public class SpiTest {
    public static void main(String[] args) {
        URL url = URL.valueOf("test://localhost/test")
                .addParameter("my.test.registry", "zookeeper");

        MyTestRegistry registry = ExtensionLoader
                .getExtensionLoader(MyTestRegistry.class)
                .getExtension("etcd");

        System.out.println("=================");
        System.out.println(registry.register(url));
        System.out.println("=================");

        registry = ExtensionLoader
                .getExtensionLoader(MyTestRegistry.class)
                .getAdaptiveExtension();

        registry.register(url);

        System.out.println(registry.register(url));
        System.out.println("=================");

        ExtensionLoader
                .getExtensionLoader(MyTestRegistry.class)
                .getActivateExtension(url, new String[]{}, "GROUP_B")
                .forEach(p -> System.out.println(p.register(url)));
        System.out.println("=================");
    }
}

输出

=================
Etcd register already! 
=================
Zookeeper register already! 
=================
Zookeeper register already! 
Etcd register already! 
=================

总结

@SPI 标注是一个扩展点,各种实现配置在配置文件里(key是实现名字,类似spring里的bean name,value是实现类)
@Adaptive 是自适应注解,根据使用时url里的参数,动态寻找实现类
@Activate 是激活注解,可以激活一串实现,常用于filter

注解参数说明

@SPI 的 value (默认使用的extension,可填配置里的etcd或zookeeper)
@Adaptive 的 value (调用时,动态匹配url里key的名字,不填为类的驼峰转换xxx.xx.xx)
@Activate 的 group (把所有实现,进行分组,激活时,激活整个组)
@Activate 的 value (类似@Adaptive的value)
@Activate 的 order (激活时排序)

相关文章

  • 2.Dubbo内核实现之基于SPI思想Dubbo内核实现

    SPI接口定义定义了@SPI注解 只有在接口打了@SPI注解的接口类才会去查找扩展点实现 会依次从这几个文件中读取...

  • Motan SPI 机制

    Motan的两个注解 Spi,在Motan中如果要使用SPI机制,则暴露出来的接口要使用@Spi注解标注,并且可以...

  • SPI注解

    接口 两个实现 配置 测试函数 输出 总结 @SPI 标注是一个扩展点,各种实现配置在配置文件里(key是实现名字...

  • Dubbo扩展机制

    @SPI注解定义默认实现类,比如@SPI(“dubbo”)默认调用的是DubboProtocol类。 @Adapt...

  • 第4章 Dubbo SPI 的设计与实现

    本节分析 Dubbo SPI 基础源码。 Protocol 接口的定义 注意这里的两个核心注解 @SPI 和 @A...

  • 8.dubbo-SPI自定义配置

    扩展点就是@SPI注解的接口,后面的名字指定的就是默认的实现类 自定义SPI实现方式 1.在resources目录...

  • SPI框架实现之旅三:实现说明

    SPI框架实现之旅三:实现说明 前一篇 《SPI框架实现之旅二:整体设计》中,介绍了几个定义的接口,注解;叙述了实...

  • 利用dubbo扩展打印log

    原理 利用dubbo 的spi扩展机制 实现 实现Filter接口此处需要关注下注解@Activate,其中的参数...

  • ExtensionLoader扩展点加载

    getExtensionLoader的实现原理 在获取扩展加载器的时候,首先会判断是否有注解SPI,没有则抛异常,...

  • [Spring MVC]Spring MVC与Servlet标准

    Tomcat容器 spring整合Tomcat经常看到的web.xml Servler3.0后,提供了注解+SPI...

网友评论

      本文标题:SPI注解

      本文链接:https://www.haomeiwen.com/subject/eeozoctx.html