Java SPI概念、实现原理、优缺点、应用场景、使用步骤、实战SPI案例
warning:
这篇文章距离上次修改已过210天,其中的内容可能已经有所变动。
Java SPI(Service Provider Interface)是一种服务发现机制,它通过在Classpath路径下的META-INF/services文件夹查找文件来动态地为接口找到实现类。
优点:
- 解耦:SPI可以让接口与实现分离,有利于系统解耦。
- 灵活:可以在不修改代码的情况下更换实现。
使用步骤:
- 在META-INF/services下创建一个文件,文件名为接口的全限定名。
- 在文件中列出所有实现类的全限定名,每个全限定名一行。
- 使用ServiceLoader.load方法加载接口的实现。
实战SPI案例:
假设有一个接口com.example.spi.MyService
,有两个实现类com.example.spi.MyServiceImpl1
和com.example.spi.MyServiceImpl2
。
- 在
src/main/resources/META-INF/services
目录下创建文件com.example.spi.MyService
。 文件内容为:
com.example.spi.MyServiceImpl1 com.example.spi.MyServiceImpl2
使用ServiceLoader加载实现:
ServiceLoader<MyService> loader = ServiceLoader.load(MyService.class); for (MyService service : loader) { service.execute(); }
注意:
- 接口实现类必须有无参构造器。
- 如果有多个jar包,它们的META-INF/services中的文件会合并。
- 如果某个实现类不想被加载,可以在它的类名前加上
#
注释掉。
评论已关闭