java SPI机制
程序员文章站
2023-11-10 21:32:46
1、 SPI是Service Provider Interfaces的简称。根据Java的SPI规范,我们可以定义一个服务接口,具体的实现由对应的实现者去提供,即Service Provider(服务提供者)。然后在使用的时候只要根据SPI的规范去获取对应的服务提供者的服务实现即可 SPI机制的约定 ......
1、 spi是service provider interfaces的简称。根据java的spi规范,我们可以定义一个服务接口,具体的实现由对应的实现者去提供,即service provider(服务提供者)。然后在使用的时候只要根据spi的规范去获取对应的服务提供者的服务实现即可
spi机制的约定:
1) 在meta-inf/services/目录中创建以接口全限定名命名的文件该文件内容为api具体实现类的全限定名
2) 使用serviceloader类动态加载meta-inf中的实现类
3) 如spi的实现类为jar则需要放在主程序classpath中
4) api具体实现类必须有一个不带参数的构造方法
参考此博客:https://blog.csdn.net/zmx729618/article/details/53285416?utm_source=copy
实例代码如下:
package com.rookie.bigdata; /** * created by on 2018/9/29. */ public interface spiservice { public void print(string msg); }
package com.rookie.bigdata; /** * created by on 2018/9/29. */ public class tjservice implements spiservice { @override public void print(string msg) { system.out.println("天津市"); } } package com.rookie.bigdata; /** * created by on 2018/9/29. */ public class bjservice implements spiservice { @override public void print(string msg) { system.out.println("北京市"); } }
com.rookie.bigdata.spiservice文件内如如下:
#bj com.rookie.bigdata.bjservice #tj com.rookie.bigdata.tjservice
测试代码
package com.rookie.bigdata; import org.junit.test; import java.util.serviceloader; /** * created by on 2018/9/29. */ public class spitest { @test public void test1() { serviceloader<spiservice> serviceloader = serviceloader.load(spiservice.class); spiservice spiservice = null; for (spiservice service : serviceloader) { service.print("spi"); } } }