今天在读dubbo源码的时候看到里面有个SPI,之前很少见到,查了很多资料,总结如下:
概念:
SPI (Service Provider Interface) JDK内置的一种服务提供发现机制,现在有很多框架使用其来做服务的扩展发现,主要用于第三方提供接口的实现上,我们常见的比如JDBC驱动,有MySQL、Oracle的等等。
规范:
说明:
- 首先建立文件夹META-INF/services,放在classpath下;
- 然后再文件夹下创建文件,并以接口的全限定名命名
- 文件中写入接口的实现类的全限定名,每行一个
- 最后使用 ServiceLoader.load() 加载类
例子:
项目结构如下
具体代码
package com.wgq.spi;
public interface HelloInterface {
void say(String msg);
}
package com.wgq.spi;
public class ChineseHello implements HelloInterface {
@Override
public void say(String msg) {
System.out.println("你好," + msg);
}
}
package com.wgq.spi;
public class EnglishHello implements HelloInterface {
@Override
public void say(String msg) {
System.out.println("Hello," + msg);
}
}
package com.wgq.spi;
import java.util.ServiceLoader;
public class TestSPI {
public static void main(String[] args) {
ServiceLoader<HelloInterface> serviceLoader = ServiceLoader.load(HelloInterface.class);
for (HelloInterface hello : serviceLoader) {
hello.say("ha ha");
}
}
}
运行结果:
你好,ha ha
Hello,ha ha