一、为什么用
Java的SPI(Service Provider Interface)机制在实际开发中有许多用途和好处:
插件化架构:SPI机制可以实现插件化架构,使应用程序可以方便地扩展功能和功能模块。通过定义服务接口和实现类的方式,第三方库或组件可以提供自己的实现类,并在运行时被应用程序动态加载和使用。这样,应用程序可以根据需要选择和使用不同的插件,实现更灵活的功能扩展。
组件化和模块化开发:SPI机制支持组件化和模块化开发,通过将接口和实现类分离,可以更好地划分代码结构和功能模块。不同的实现类可以作为独立的组件或模块进行开发和维护,提高代码的可维护性和可重用性。
框架扩展和定制:SPI机制为框架提供了扩展和定制的能力。框架可以定义服务接口,并允许开发者根据自己的需求提供自定义的实现类。这样,开发者可以根据具体场景和业务需求,通过实现接口定制框架的行为和功能。
库和工具集成:许多开源库和工具使用SPI机制来实现扩展点和插件机制,以便与其他库和工具集成。通过SPI机制,应用程序可以方便地集成不同的库和工具,提供更丰富的功能和更灵活的配置。
配置和加载策略:SPI机制可以用于实现配置和加载策略。通过在配置文件中指定实现类的全限定名,应用程序可以动态地加载和使用这些实现类。这种灵活的配置和加载策略可以根据需求进行定制,提供更好的适配性和扩展性。
总的来说,Java的SPI机制提供了一种灵活、解耦的方式,用于实现插件化架构、组件化开发、框架扩展等场景。它提供了一种标准的服务发现和加载机制,使得应用程序可以更加灵活、可扩展,并能与其他库和工具进行集成。
二、使用
创建接口
package com.zhk.server.plugin;
public interface Plugin {
void execute();
}
实现接口
package com.zhk.server.plugin;
public class MyPlugin implements Plugin {
@Override
public void execute() {
System.out.println("插件实现方法执行了-----------MyPlugin");
}
}
在resources下面创建META-INF/services创建文件com.zhk.server.plugin.Plugin 在文件中写入
com.zhk.server.plugin.MyPlugin
测试
public static void main(String[] args) {
ServiceLoader<Plugin> load = ServiceLoader
.load(Plugin.class);
for (Plugin plugin : load) {
plugin.execute();
}
}
这个时候我想换掉这个MyPlugin直接实现对应的实现类 把在resources下面创建META-INF/services路径改掉就行了
拓展
- 看下@SPI注解
- resources下面创建META-INF/services创建文件com.zhk.server.plugin.Plugin
多个拓展的时候
a=com.zhk.server.plugin.MyPlugin
b=com.zhk.server.plugin.xxxx
调用
ExtensionLoader<Plugin> ext = ExtensionLoader.getExtensionLoader(Plugin.class);
Plugin a = ext.getExtension("a");
a.execute();