java spi
1.什么是SPI
SPI ,全称为 Service Provider Interface,通常情况下,服务提供方提供接口和实现,调用方进行调用,一般情况下,调用方如果想扩展功能,就要自己实现服务方接口,这时候就需要用到spi技术,比如
dubbo服务中,dubbo自己实现了几种loadblance算法,如果调用方想自定义自己的负载均衡算法,就可以在META-INF/services文件下实现自己的算法来扩展功能
2.SPI简单实现
下面,给出一个demo,一个发送消息的功能,你可以选择发到微信钉钉企业微信,有不同的实现,由你自己选择扩展
定义接口
package com.example.demo.spi;
/**
* @author xiangwei.li
* @version 1.0.0
* @date 2021/9/9
*/
public interface MsgPushInterface {
void push(String msg);
}
增加实现
package com.example.demo.spi;
/**
* @author xiangwei.li
* @version 1.0.0
* @date 2021/9/9
*/
public class MsgPushToDingDing implements MsgPushInterface {
@Override
public void push(String msg) {
System.out.println("发现消息到钉钉:" + msg);
}
}
package com.example.demo.spi;
/**
* @author xiangwei.li
* @version 1.0.0
* @date 2021/9/9
*/
public class MsgPushToWeChat implements MsgPushInterface {
@Override
public void push(String msg) {
System.out.println("发送消息到微信:" + msg);
}
}
在resources目录下新建META-INF/services目录,然后在这个目录新建一个文件,文件名=接口的全限定名,在这个文件中写入实现类的全限定名
调用
public static void main(String[] args) {
ServiceLoader<MsgPushInterface> serviceLoader = ServiceLoader.load(MsgPushInterface.class);
for (MsgPushInterface msgPushInterface : serviceLoader) {
msgPushInterface.push("hello world");
}
}
输出结果显示是调钉钉的,如果meta-inf文件下里写的是发到微信的接口,就会调微信的实现