java ServiceLoader SPI 机制
ServiceLoader
是 Java 提供的一种服务发现机制,用于实现服务提供者接口(SPI)的动态加载。它可以在运行时发现并加载实现了某个接口的服务提供者,实现解耦和动态扩展功能。
工作原理
接口定义:
- 你需要为某个功能定义一个接口(或抽象类),供其他模块实现。
服务提供者实现:
- 其他模块可以实现这个接口,提供不同的实现。
配置文件:
- 在实现模块的资源目录下创建文件:
META-INF/services/<接口的全限定名>
。 - 文件内容是实现类的全限定名,每行一个。
- 在实现模块的资源目录下创建文件:
使用
ServiceLoader
:- 使用
ServiceLoader.load(Interface.class)
来加载接口的所有实现。 ServiceLoader
会在类路径中查找META-INF/services
目录,读取配置文件,实例化实现类。
- 使用
示例代码
1 | // 定义接口 |
优点
- 解耦:客户端无需知道具体实现类。
- 动态扩展:可以在不修改客户端代码的情况下添加新实现。
- 模块化:适用于插件式架构。
注意事项
- 配置文件路径和内容必须正确。
- 所有实现类必须有无参构造函数。
ServiceLoader
使用时是懒加载,第一次使用时才会初始化实现类。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Warms!