zoukankan      html  css  js  c++  java
  • Dubbo原理解析-Dubbo内核实现之SPI简单介绍

    转自:https://blog.csdn.net/quhongwei_zhanqiu/article/details/41577159

    Dubbo

    采用微内核+插件体系,使得设计优雅,扩展性强。那所谓的微内核+插件体系是如何实现的呢!

    spi(service provider interface)机制,即我们定义了服务接口标准,让厂商去实现(如果不了解spi的请谷歌百度下)

    jdk通过ServiceLoader类实现spi机制的服务查找功能。

    JDK实现spi服务查找: ServiceLoader

    首先定义下示例接口

    package com.example;

    public interface Spi {

           booleanisSupport(String name);

           String sayHello();

    }

    ServiceLoader会遍历所有jar查找META-INF/services/com.example.Spi文件

    A厂商提供实现

    package com.a.example;

    public class SpiAImpl implements Spi {

           publicboolean isSupport(String name) {

                  return"SPIA".equalsIgnoreCase(name.trim()); 

    }

    public String syaHello() {

           return “hello 我是厂商A”;

    }

    }

    在A厂商提供的jar包中的META-INF/services/com.example.Spi文件内容为:

    com.a.example.SpiAImpl        #厂商A的spi实现全路径类名

    B厂商提供实现

    package com.b.example;

    public class SpiBImpl implements Spi {

           publicboolean isSupport(String name) {

                  return"SPIB".equalsIgnoreCase(name.trim()); 

    }

    public String syaHello() {

           return “hello 我是厂商B”;

    }

    }

    在B厂商提供的jar包中的META-INF/services/com.example.Spi文件内容为:

    com.b.example.SpiBImpl        #厂商B的spi实现全路径类名

    ==================================== 

    ServiceLoader.load(Spi.class)

    读取厂商A、B提供jar包中的文件,ServiceLoader实现了Iterable接口可通过while for 循环语句遍历出所有实现。

    一个接口多种实现,就如策略模式一样提供了策略的实现,但是没有提供策略的选择, 使用方可以根据isSupport方法根据业务传入厂商名来选择具体的厂商。

    public class SpiFactory {

           //读取配置获取所有实现

           privatestatic ServiceLoader spiLoader = ServiceLoader.load(Spi.class);

           //根据名字选取对应实现

           publicstatic Spi getSpi(String name) {

                  for(Spi spi : spiLoader) {

                         if(spi.isSupport(name) ) {

                                returnspi;

                         }

                  }

                  returnnull;

    }

    }
     
    参考:https://blog.csdn.net/top_code/article/details/51934459
     
     
  • 相关阅读:
    loaded some nib but the view outlet was not set
    指标评比
    IOS DEVELOP FOR DUMMIES
    软件测试题二
    javascript select
    DOM节点类型详解
    mysql操作
    UVA 10055
    solutions for 'No Suitable Driver Found For Jdbc'
    解决git中文乱码问题
  • 原文地址:https://www.cnblogs.com/xingzc/p/9141326.html
Copyright © 2011-2022 走看看