1.什么是Java SPI ?
SPI全称Service Provider Interface,在Java中还是一个比较重要的概念,是Java提供的一套用来被第三方实现或者扩展的API,或者换句话说,
SPI是一种服务发现机制。
SPI 将服务接口和具体的服务实现分离开来,将服务调用方和服务实现者解耦,能够提升程序的扩展性、可维护性。修改或者替换服务实现并不需要修改调用方。
很多框架都使用了 Java 的 SPI 机制,比如:Spring 框架、数据库加载驱动、日志接口、以及 Dubbo 的扩展实现等等。
2.SPI原理是什么?
要使用SPI比较简单,只需要按照以下几个步骤操作即可:
- 在jar包的META-INF/services目录下创建一个以"接口全限定名"为命名的文件,内容为实现类的全限定名
- 接口实现类所在的jar包在classpath下
- 主程序通过java.util.ServiceLoader动态状态实现模块,它通过扫描META-INF/services目录下的配置文件找到实现类的全限定名,把类加载到JVM
- SPI的实现类必须带一个无参构造方法
3.代码工程
实验目标
基于spi实现搜索功能扩展
service
package com.et;
public interface SearchService {
String search(String key);
}
package com.et;
public class RedisSearch implements SearchService{
@Override
public String search(String key) {
return "Redissearch" + key + "result Yes";
}
}
package com.et;
public class MysqlSearch implements SearchService{
@Override
public String search(String key) {
return "Mysqlsearch" + key + "result No";
}
}
com.et.SearchService
com.et.MysqlSearch
com.et.RedisSearch
4.测试
测试类
package com.et;
import java.util.ServiceLoader;
public class Main {
public static void main(String[] args) {
ServiceLoader<SearchService> serviceLoader = ServiceLoader.load(SearchService.class);
System.out.println("============ Java SPI test===========");
serviceLoader.forEach(loader -> System.out.println(loader.search("Yes Or No")));
}
}
运行main方法
============ Java SPI test===========
MysqlsearchYes Or Noresult No
RedissearchYes Or Noresult Yes
5.引用