SPI应用

需求:在实现全局接口的校验的时候,我想到的是,

1.首先为所有的接口创建输入输出参数的bean

2.然后为从aop的切点处获取方法名,参数等,根据SPI 获取相应类,然后转成bean,调用类的检验方法(所有的bean 都实现IBean接口)

3.参数校验通过,再进入方法

接下来研究SPI - Service Provider Interface  服务加载方式

SPI机制的约定

  1. 在 META-INF/services/ 目录中创建以接口全限定名命名的文件,该文件内容为API具体实现类的全限定名

  2. 使用 ServiceLoader 类动态加载 META-INF 中的实现类

  3. 如 SPI 的实现类为 Jar 则需要放在主程序 ClassPath 中

  4. API 具体实现类必须有一个不带参数的构造方法

例子:

public interface People {
    public String speak();
}
public class English implements People{
    public String speak() {
        return "English speak English";
    }
}
public class Chinese implements People{
    public String speak() {
        return "chinese speak zhongwen";
    }
}

资源路径下/META-INF.services/(接口类全路径)com.atguigu.gmall.SPI

com.atguigu.gmall.SPI.Chinese
com.atguigu.gmall.SPI.English

测试类:

@Test
public void testSpi(){
    ServiceLoader<People> peoples=ServiceLoader.load(People.class);
    for (People people:peoples){
        System.out.println(people.speak());
    }
}

结果:

chinese speak zhongwen
English speak English

Dubbo SPI 注解

官网解释:

http://dubbo.apache.org/zh-cn/docs/source_code_guide/dubbo-spi.html

例子:

@SPI
public interface People {
    public String speak();
}
public class English implements People{
    public String speak() {
        return "English speak English";
    }
}
public class Chinese implements People{
    public String speak() {
        return "chinese speak zhongwen";
    }
}

资源路径下/META-INF.services/(接口类全路径)com.atguigu.gmall.SPI

chinese=com.atguigu.gmall.SPI.Chinese
english=com.atguigu.gmall.SPI.English

测试代码:

@Test
public void testDubbo(){
    ExtensionLoader<People> extensionLoader=
            ExtensionLoader.getExtensionLoader(People.class);
    People chinese = extensionLoader.getExtension("chinese");
    System.out.println(chinese.speak());
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章