万万没想到,当下最流行的剧本杀,如今也成了色情温床!作为靠角色扮演来推理故事的游戏,剧本杀一直备受年轻人的喜爱,通过它能更好地锻炼大脑和社交能力。可如...
2025-08-18 0
SPI(Service Provider Interface)是Java提供的一种服务加载机制,用于在运行时动态发现并加载服务的具体实现类。它的核心思想是将服务的接口与具体实现解耦,让第三方开发者可以通过实现统一接口来扩展系统功能,而无需修改原有代码。
public interface MessageEncoder { String encode(String message);}
public class JsonEncoder implements MessageEncoder { @Override public String encode(String message) { return "{\"data\":\"" + message + "\"}"; }}public class XmlEncoder implements MessageEncoder { @Override public String encode(String message) { return "<data>" + message + "</data>"; }}
在src/main/resources/META-INF/services目录下创建com.example.MessageEncoder文件,内容为:
com.example.JsonEncodercom.example.XmlEncoder
public class SpiDemo { public static void main(String[] args) { ServiceLoader<MessageEncoder> loader = ServiceLoader.load(MessageEncoder.class); for (MessageEncoder encoder : loader) { System.out.println(encoder.encode("Hello SPI!")); } }}
输出结果:
{"data":"Hello SPI!"}<data>Hello SPI!</data>
在配置文件中按顺序书写实现类名称,ServiceLoader会按顺序加载:
com.example.XmlEncodercom.example.JsonEncoder
想要完全自定义顺序?可以继承ServiceLoader重写iterator()方法:
public class CustomServiceLoader<T> extends ServiceLoader<T> { @Override public Iterator<T> iterator() { // 先加载系统优先级高的实现类 List<T> providers = new ArrayList<>(); providers.add(findProvider("com.example.JsonEncoder")); providers.addAll(super.iterator()); return providers.iterator(); }}
传统SPI依赖静态文件,结合Spring Cloud Config或Apollo可以实现动态刷新:
@Configurationpublic class SpiConfig { @Bean public MessageEncoder messageEncoder(ConfigurableApplicationContext context) { String encoderType = context.getEnvironment().getProperty("message.encoder.type"); ServiceLoader<MessageEncoder> loader = ServiceLoader.load(MessageEncoder.class); for (MessageEncoder encoder : loader) { if (encoder.getClass().getSimpleName().equalsIgnoreCase(encoderType)) { return encoder; } } throw new IllegalArgumentException("Unknown encoder type"); }}
Java SPI通过标准化配置+动态加载机制,为开发者提供了一种灵活的服务扩展方案。其核心价值在于:
在实际开发中,建议将SPI与工厂模式结合使用,既能保留SPI的动态扩展能力,又能简化客户端调用逻辑。
相关文章
万万没想到,当下最流行的剧本杀,如今也成了色情温床!作为靠角色扮演来推理故事的游戏,剧本杀一直备受年轻人的喜爱,通过它能更好地锻炼大脑和社交能力。可如...
2025-08-18 0
“爸,这手机又卡了?”“妈,验证码在哪儿看啊?” 每次回家帮父母摆弄手机,是不是都像在解一道难题?给父母选手机,真不是挑参数、比性能那么简单 —— 他...
2025-08-18 0
就安卓手机厂商来说,发布折叠屏手机已经见怪不怪了,但当听到苹果折叠屏手机消息,可以说是满是惊喜,因为截至目前,作为国际顶尖科技大厂,苹果公司仍旧没有发...
2025-08-18 0
美俄总统在阿拉斯加会面后,特朗普对华表态与此前立场有所不同。据路透社消息,特朗普表示暂时不会对中国等购买俄罗斯石油的国家加征关税,相关问题可延后两三周...
2025-08-18 0
2025年8月17日,首届世界人形机器人运动会落下帷幕,竞技赛、场景赛、外围赛等各项比赛相继决出了赢家和输家。机器人之间纯粹的技术较量?是,又不是——...
2025-08-18 0
一、SPI是什么?SPI(Service Provider Interface)是Java提供的一种服务加载机制,用于在运行时动态发现并加载服务的具体...
2025-08-18 1
在智能手机系统的讨论中,“流畅度” 始终是绕不开的核心话题。iOS 作为苹果生态的 “灵魂”,鸿蒙作为国产系统的标杆,两者在流畅度表现上各有侧重,很难...
2025-08-18 0
发表评论