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文件下里写的是发到微信的接口,就会调微信的实现

 

posted @ 2021-09-09 10:31  qiushui  阅读(43)  评论(0)    收藏  举报