java spi 机制

参考:https://www.cnblogs.com/huzi007/p/6679215.html

参考:https://www.cnblogs.com/lovesqcc/p/5229353.html

参考:https://blog.csdn.net/a718515028/article/details/72457436

java spi 机制 介绍:

SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。

目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现的机制, 举个例子来说, 有个接口,想运行时动态的给它添加实现,你只需要添加一个实现。

具体是在JAR包的"src/META-INF/services/"目录下建立一个文件,文件名是接口的全限定名,文件的内容可以有多行,每行都是该接口对应的具体实现类的全限定名.

应用场景:

1. 比如说你想动态的添加扩展某个框架的接口,或添加添加新的插件

2. 比如你的系统一个接口下有n个实现,需要导入一个相同的controller 中,可以用spi ,一次加载导入

具体例子:

比如Java jdbc 的应用,mysql-connector-java-5.1.18.jar 就有一个 /META-INF/services/java.sql.Driver 里面内容是 com.mysql.jdbc.Driver 。

测试例子:

STEP1. 定义一组接口, 假设是 autocomplete.PrefixMatcher;

STEP2. 写出接口的一个或多个实现(autocomplete.EffectiveWordMatcher, autocomplete.SimpleWordMatcher);

STEP3. 在 src/main/resources/ 下建立 /META-INF/services 目录, 新增一个以接口命名的文件 autocomplete.PrefixMatcher, 内容是要应用的实现类(autocomplete.EffectiveWordMatcher 或 autocomplete.SimpleWordMatcher 或两者);

STEP4. 使用 ServiceLoader 来加载配置文件中指定的实现。 

代码:

package autocomplete;

import java.util.Iterator;
import java.util.ServiceLoader;

/**
 * Created by lovesqcc on 16-2-29.
 */
public class PrefixMatcherTest {

    public static void main(String[] args) {
        ServiceLoader<PrefixMatcher> matcher = ServiceLoader.load(PrefixMatcher.class);
        Iterator<PrefixMatcher> matcherIter = matcher.iterator();
        while (matcherIter.hasNext()) {
            PrefixMatcher wordMatcher = matcherIter.next();
            System.out.println(wordMatcher.getClass().getName());
            String[] prefixes = new String[] {"a", "b", "c", "d", "e", "f", "g", "i",
                    "l", "n", "p", "r", "s", "t", "v", "w", "do", "finally"};
            for (String prefix: prefixes) {
                System.out.println(wordMatcher.obtainMatchedWords(prefix));
            }
        }

    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值