欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java SPI机制

程序员文章站 2023-11-10 21:32:46
1、 SPI是Service Provider Interfaces的简称。根据Java的SPI规范,我们可以定义一个服务接口,具体的实现由对应的实现者去提供,即Service Provider(服务提供者)。然后在使用的时候只要根据SPI的规范去获取对应的服务提供者的服务实现即可 SPI机制的约定 ......

1、 spi是service provider interfaces的简称。根据java的spi规范,我们可以定义一个服务接口,具体的实现由对应的实现者去提供,即service provider(服务提供者)。然后在使用的时候只要根据spi的规范去获取对应的服务提供者的服务实现即可

spi机制的约定:

1)         在meta-inf/services/目录中创建以接口全限定名命名的文件该文件内容为api具体实现类的全限定名

2)         使用serviceloader类动态加载meta-inf中的实现类

3)         如spi的实现类为jar则需要放在主程序classpath中

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

参考此博客:https://blog.csdn.net/zmx729618/article/details/53285416?utm_source=copy 

实例代码如下:

java SPI机制

package com.rookie.bigdata;

/**
 * created by  on 2018/9/29.
 */
public interface spiservice {

    public void print(string msg);
}
package com.rookie.bigdata;

/**
 * created by  on 2018/9/29.
 */
public class tjservice implements  spiservice {
    @override
    public void print(string msg) {
        system.out.println("天津市");
    }
}


package com.rookie.bigdata;

/**
 * created by  on 2018/9/29.
 */
public class bjservice implements  spiservice {
    @override
    public void print(string msg) {
        system.out.println("北京市");
    }
}

com.rookie.bigdata.spiservice文件内如如下:

#bj
com.rookie.bigdata.bjservice
#tj
com.rookie.bigdata.tjservice

测试代码

package com.rookie.bigdata;

import org.junit.test;

import java.util.serviceloader;

/**
 * created by  on 2018/9/29.
 */
public class spitest {

    @test
    public void test1() {

        serviceloader<spiservice> serviceloader = serviceloader.load(spiservice.class);
        spiservice spiservice = null;
        for (spiservice service : serviceloader) {

            service.print("spi");
        }
    }
}