Java SPI机制是个啥

SPI

Posted by WS on August 15, 2020

1.背景

最近公司自动化测试报告准备修改, 看到了开源Allure报告不错, 整个项目修改使用, 使用中研究修改Allure源码, 发现了以前没研究过的一个东西, 虽然用到的地方很多, 就是SPI机制, java中需要学习的地方真的很多啊

2.概念原理

SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件;

Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制;

就是一个接口, 具体实现谁都可以写, 只要遵循我这个加载的固定写法就行, 这也就是Allure为什么, 不需要任何的单独加载引入具体方法, 只要在pom中把allure-java包依赖写入, 通过SPI机制, Allure实现注册了testng等测试套件的Listener方法, 所以就实现了无缝的报告插件, 可谓巧妙;

常见例子: JDBC, SLF4J等

3.SPI规则约束

  1. 当服务提供者提供了接口的一种具体实现后,在jar包的META-INF/services目录下创建一个以“接口全限定名”为命名的文件,内容为实现类的全限定名;

  2. 接口实现类所在的jar包放在主程序的classpath中;

  3. 主程序通过java.util.ServiceLoder动态装载实现模块,它通过扫描META-INF/services目录下的配置文件找到实现类的全限定名,把类加载到JVM;

  4. SPI的实现类必须携带一个不带参数的构造方法;

4.Allure中具体实现

io.qameta.allure.testng.AllureTestNg 就是Allure实现的入口类, 通过这个实现具体的报告记录细节

org.testng.ITestNGListener 就是listener, 不同的测试框架有不同的, 比如最常见的junit的, 只要能提供入口的框架 , 理论上都可以allure

javascript

参考资料: 高级开发必须理解的Java中SPI机制 - 简书 (jianshu.com)


%