码迷,mamicode.com
首页 > 其他好文 > 详细

理解SPI

时间:2019-02-23 00:55:52      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:除了   重要   test   inf   接下来   err   inter   ima   注解   

     SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。

    Dubbo 并未使用 Java 原生的 SPI 机制,而是对其进行了增强,使其能够更好的满足需求。在 Dubbo 中,SPI 是一个非常重要的模块。基于 SPI,我们可以很容易的对 Dubbo 进行拓展。如果大家想要学习 Dubbo 的源码,SPI 机制务必弄懂。接下来,我们先来了解一下 Java SPI 与 Dubbo SPI 的用法,然后再来分析 Dubbo SPI 的源码。

   1.0 Java SPI 示例

   

//定义接口
public interface SpiInterface
{ void sayHello(); } 

//实现类
public class SpiImpl01 implements SpiInterface {
@Override
public void sayHello() {
System.out.println("Hello, I am SpiImpl01.");
}
}
public class SpiImpl02 implements SpiInterface{
@Override
public void sayHello() {
System.out.println("Hello, I am SpiImpl02.");
}
}

   META-INF/services 文件夹下创建一个文件,名称为Spi的全限定名 接口路径

   文件内容:

com.demo.javaSpi.SpiImpl01
com.demo.javaSpi.SpiImpl02
public class JavaSPITest {

    @Test
    public void sayHello() throws Exception {
        ServiceLoader<SpiInterface> serviceLoader =ServiceLoader.load(SpiInterface.class); 
System.out.println(
"Java SPI");
serviceLoader.forEach(Spi::sayHello);
} }

结果:技术图片

       2.0 Dubbo SPI 示例

      SpiInterface接口加@SPI 注解

 

public class DubboSpiTest {
    @Test
    public void sayHello() throws Exception {
        ExtensionLoader<SpiInterface> extensionLoader = ExtensionLoader.getExtensionLoader(SpiInterface.class);
        SpiInterface spiImpl01 = extensionLoader.getExtension("spiImpl01");
        spiImpl01.sayHello();
        SpiInterface spiImpl02 = extensionLoader.getExtension("spiImpl02");
        spiImpl02.sayHello();
    }
}

结果:技术图片

Dubbo SPI 除了支持按需加载接口实现类,还增加了 IOC 和 AOP 等特性

 3.0 Dubbo SPI 源码分析

  待续

理解SPI

标签:除了   重要   test   inf   接下来   err   inter   ima   注解   

原文地址:https://www.cnblogs.com/dyg0826/p/10421301.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!