spi(Service Provider Interface, 服务者提供接口), 可加载特定接口未知实现类。
使用方式(基础):
- 本jar包定义接口Service.java
- 其他jar包实现该接口,需要公共无参构造函数。
- 实现该接口的jar包添加文件
/resources/META-INF/services/{serviceName})
, 其中{serviceName}
替换为实现的接口全限定名。内容为实现该接口的类全限定名,每行一条。可使用#
进行注释。spi.Service - 即可使用
ServiceLoader
加载对应类。Main.java
使用方式(模块):
- 本jar包定义接口Service.java, 且
module-info
需导出该对应包exports {package};
- 其他jar包实现该接口,需要公共无参构造函数, 或者提供包含公共静态无参
provider
方法的工厂类。 module-info
添加provides {serviceName} with {implName};
, 其中{serviceName}
替换为实现的接口全限定名。内容为实现该接口的类全限定名,{implName}
替换为实现的类或工厂类全限定名。- 即可使用
ServiceLoader
加载对应类。Main.java。该包module-info
需使用对应类uses {serviceName};