java 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 

实例代码如下:

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");
        }
    }
}
原文地址:https://www.cnblogs.com/haizhilangzi/p/9723351.html