码迷,mamicode.com
首页 > 编程语言 > 详细

Java SPI(Service Provider Interface)

时间:2018-07-19 14:52:28      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:扩展   for   port   文件中   imp   style   str   语句   循环   

SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现的机制, 举个例子来说,有个接口,想运行时动态的给它添加实现,你只需要添加一个实现。

当服务的提供者提供了一种接口的实现之后,需要在classpath下的META-INF/services/目录里创建一个以服务接口命名的文件,这个文件里的内容就是这个接口的具体的实现类。当其他的程序需要这个服务的时候,就可以通过查找这个jar包(一般都是以jar包做依赖)的META-INF/services/中的配置文件,配置文件中有接口的具体实现类名,可以根据这个类名进行加载实例化,就可以使用该服务了。JDK中查找服务的实现的工具类是:java.util.ServiceLoader。

SPI实例

定义接口

package org.cellphone.api;

public interface DataSource {

    String getConnection();
}

Oracle厂商实现接口

package org.cellphone.oracle;

import org.cellphone.api.DataSource;

public class DataSourceImpl implements DataSource {
    @Override
    public String getConnection() {
        return "Oracle提供数据库连接池";
    }
}

并在classpath下的META-INF/services/目录下以接口全路径名定义文件:org.cellphone.api.DataSource,文件内容为:

org.cellphone.oracle.DataSourceImpl

MySQL厂商实现接口

package org.cellphone.mysql;

import org.cellphone.api.DataSource;

public class DataSourceImpl implements DataSource {
    @Override
    public String getConnection() {
        return "MySQL提供数据库连接池";
    }
}

并在classpath下的META-INF/services/目录下以接口全路径名定义文件:org.cellphone.api.DataSource,文件内容为:

org.cellphone.mysql.DataSourceImpl

ServiceLoader.load(DataSource.class)读取厂商Oracle、MySQL提供jar包中的文件,ServiceLoader实现了Iterable接口可通过while for循环语句遍历出所有实现。

package org.cellphone.invoker;

import org.cellphone.api.DataSource;

import java.util.ServiceLoader;

public class Main {
    private static ServiceLoader<DataSource> loader = ServiceLoader.load(DataSource.class);

    public static void main(String[] args) {
        for (DataSource source : loader) {
            System.out.println(source.getConnection());
        }
    }
}

 

Java SPI(Service Provider Interface)

标签:扩展   for   port   文件中   imp   style   str   语句   循环   

原文地址:https://www.cnblogs.com/wuxiaofeng/p/9335530.html

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