参考: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));
}
}
}
}