spi机制

62 阅读1分钟

SPI(Service Provider Interface),是JDK内置的一种 服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用,比如java.sql.Driver接口,其他不同厂商可以针对同一接口做出不同的实现,MySQL和PostgreSQL都有不同的实现提供给用户,而Java的SPI机制可以为某个接口寻找服务实现。Java中SPI机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是 解耦

图示:

image.png

代码示例:

接口(一般由框架或者第三方提供)

public interface IUser {

    public List<String> getUserList();

}

接口实现类(调用者实现逻辑)

public class UserImpl implements IUser {
    @Override
    public List<String> getUserList() {
        ArrayList<String> list = new ArrayList<>();
        list.add("小张");
        list.add("小李");
        list.add("小宋");
        return list;
    }
}

项目resources下新建META-INF/services添加一个名为接口全类名文件,里面填写实现类全类名

image.png

image.png

测试

public class Client {

    public static void main(String[] args) {
        ServiceLoader<IUser> loader = ServiceLoader.load(IUser.class);
        Iterator<IUser> iterator = loader.iterator();
        while (iterator.hasNext()){
            IUser userList = iterator.next();
            List<String> list = userList.getUserList();
            System.out.println(list);
        }
    }
}

image.png

结果:输出实现类内容,如果文件里写上两个实现类,那最后的输出结果就是两行了。

结论:spi的思想,接口的实现由provider实现,provider只用在提交的jar包里的META-INF/services下根据平台定义的接口新建文件,并添加进相应的实现类内容就好。