Dubbo-SPI机制

超、凢脫俗 2022-01-29 15:34 405阅读 0赞

一、Java的SPI机制

通过一个简单的例子来了解一下Java的SPI机制:

1、写了一个接口。

  1. package com.common.study;
  2. import com.alibaba.dubbo.common.extension.SPI;
  3. /**
  4. * @Interface DubboJavaRoot
  5. * @Description TODO
  6. * @Author xuyang7
  7. * @Date 2019/5/22 11:40
  8. * @Version 1.0
  9. **/
  10. //@SPI
  11. public interface DubboJavaRoot {
  12. void sayHello();
  13. }

2、然后写两个实现类:

  1. package com.common.study.impl;
  2. import com.common.study.DubboJavaRoot;
  3. /**
  4. * @ClassName JavaSPIImp1
  5. * @Description TODO
  6. * @Author xuyang7
  7. * @Date 2019/5/22 11:42
  8. * @Version 1.0
  9. **/
  10. public class JavaSPIImp1 implements DubboJavaRoot {
  11. @Override
  12. public void sayHello() {
  13. System.out.println("Hello, I am JavaSPIImp1.");
  14. }
  15. }
  16. package com.common.study.impl;
  17. import com.common.study.DubboJavaRoot;
  18. /**
  19. * @ClassName JavaSPIImp2
  20. * @Description TODO
  21. * @Author xuyang7
  22. * @Date 2019/5/22 11:42
  23. * @Version 1.0
  24. **/
  25. public class JavaSPIImp2 implements DubboJavaRoot {
  26. @Override
  27. public void sayHello() {
  28. System.out.println("Hello, I am JavaSPIImp2.");
  29. }
  30. }

3、然后在 src/main/resources/ 下建立 /META-INF/services 目录创建一个以接口引用为名称的文件内容为两个实现类的引用:

  1. com.common.study.impl.JavaSPIImp1
  2. com.common.study.impl.JavaSPIImp2

文件层次如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1lhbmd6YWlMZUhlSGU_size_16_color_FFFFFF_t_70

创建执行类:

  1. public class JavaSPITest {
  2. public static void main(String[] args) {
  3. ServiceLoader<DubboJavaRoot> serviceLoader = ServiceLoader.load(DubboJavaRoot.class);
  4. System.out.println("Java SPI");
  5. serviceLoader.forEach(DubboJavaRoot::sayHello);
  6. }
  7. }

执行结果如下:

20190522144212557.jpg

  1. ServiceLoader代码了解:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1lhbmd6YWlMZUhlSGU_size_16_color_FFFFFF_t_70 1

二、Dubbo的SPI机制

Dubbo自己实现了一套SPI机制,并没有使用Java的SPI机制:

1、我们要在接口类上添加注解@SPI:

  1. @SPI
  2. public interface DubboJavaRoot {
  3. void sayHello();
  4. }

2、编写接口实现类:

  1. package com.common.study.impl;
  2. import com.common.study.DubboJavaRoot;
  3. /**
  4. * @ClassName DubboSPIImp1
  5. * @Description TODO
  6. * @Author xuyang7
  7. * @Date 2019/5/22 11:42
  8. * @Version 1.0
  9. **/
  10. public class DubboSPIImp1 implements DubboJavaRoot {
  11. @Override
  12. public void sayHello() {
  13. System.out.println("Hello, I am DubboSPIImp1.");
  14. }
  15. }
  16. package com.common.study.impl;
  17. import com.common.study.DubboJavaRoot;
  18. /**
  19. * @ClassName DubboSPIImp2
  20. * @Description TODO
  21. * @Author xuyang7
  22. * @Date 2019/5/22 11:42
  23. * @Version 1.0
  24. **/
  25. public class DubboSPIImp2 implements DubboJavaRoot {
  26. @Override
  27. public void sayHello() {
  28. System.out.println("Hello, I am DubboSPIImp2.");
  29. }
  30. }

3、然后 我们需要建立一个在 src/main/resources/ 下建立 /META-INF/dubbo目录创建一个以接口引用为名称的文件内容为两个实现类的引用:

  1. impldubbo1 = com.common.study.impl.DubboSPIImp1
  2. impldubbo2 = com.common.study.impl.DubboSPIImp2

4、编写测试类:

  1. public class JavaSPITest {
  2. public static void main(String[] args) {
  3. JavaSPITest javaSPITest = new JavaSPITest();
  4. javaSPITest.loadDubbo();
  5. }
  6. public void loadDubbo(){
  7. ExtensionLoader<DubboJavaRoot> extensionLoader =
  8. ExtensionLoader.getExtensionLoader(DubboJavaRoot.class);
  9. DubboJavaRoot optimusPrime = extensionLoader.getExtension("impldubbo1");
  10. optimusPrime.sayHello();
  11. DubboJavaRoot bumblebee = extensionLoader.getExtension("impldubbo2");
  12. bumblebee.sayHello();
  13. }
  14. }

结果如下:

2019052214502942.jpg

在建立META-INF下面的文件时 不一定非要在dubbo下,dubbo扫描时根据ExtensionLoader中的代码如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1lhbmd6YWlMZUhlSGU_size_16_color_FFFFFF_t_70 2

  1. 所以我们只要注意根据这些建立就可以了。

与 Java SPI 实现类配置不同,Dubbo SPI 是通过键值对的方式进行配置。这里需要注意一下。

发表评论

表情:
评论列表 (有 0 条评论,405人围观)

还没有评论,来说两句吧...

相关阅读

    相关 linux页机制,Linux页面机制

    操作系统原理 华中科技大学(苏曙光) 《操作系统原理》主要内容包括:进程管理、内存管理、设备管理、文件系统等核心内容。通过理论学习和实践环节,能掌握操作系统的结构与设计,能分

    相关 SpringIOC机制

    IoC IoC(控制反转):本来是由应用程序管理的对象之间的依赖关系,现在交给了容器管理,这就叫控制反转,Spring的IoC容器主要使用DI(注入)方式实现的,不需要主

    相关 机制

    -------------------- 锁 悲观锁 概念 当多事务争取一个资源时,有可能导致数据不一致,这个时候需要一种机制限制,并且将数据访问顺序化,用

    相关 反射机制

    反射是程序可以访问,检测和修改它本身状态或者行为的一种能力。 反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。 然后,可以调用类型的方法或访问其字段和

    相关 反射机制

      反射机制是java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也运行对其内部的成员进行操作。   由于反射机制能够实现在运行时对类进行装载,因此能够增