- 看到公司的项目代码中,在META-INF下service中定义了一些文件。文件名都是以全限定类名的方式命名的,而且没每个文件里的内容也是一堆全限定类名的值。搞不懂这些是什么用途,遂百度了一下

-
看到了一篇介绍java中spi的博客链接,该博客中对于java的spi机制做了一些介绍,博客链接附上:点击打开链接
-
传统的应用中,我们对于一个接口有多个实现类。每一个实现类我们在使用的时候,都是动态去调用的。如果是基于java的spi,我们可以通过在工程的META-INF的service文件夹下创建基于接口的全限定类名的文件,文件内容是对于这个接口提供的多个实现类,内容的格式是一个实现类的全限定类名为一行。
下面通过一个具体的案例来说明spi的实现方式(官方的文档里,对于serviceloader的讲解里有一个具体的例子。):
-
首先我们定义一个接口类 com.example.CodeSet,该类中定义了一组针对于某种协议的编码解码的接口方法:
public abstract Encoder getEncoder(String encodingName);
public abstract Decoder getDecoder(String encodingName);
每个方法都根据提供的编码返回一个特定的对象,如果该方法不支持该编码格式则返回null
-
我们再定义一个实现类com.example.impl.StandardCodecs,它实现了接口CodeSet中定义的方法
-
我们在工程中创建如下格式的文件META-INF/services/com.example.CodecSet,其中com.example.CodecSet是一个文件名(该文件是基于接口的全限定类名命名的)
-
我们在CodeSet类,初始化的时候创建和保存一个单一的service instance:private static ServiceLoader<CodecSet> codecSetLoader = ServiceLoader.load(CodecSet.class);
-
定义了一个静态工厂方法,根据提供的编码名字,去迭代每一个方法的具体实现者,返回相关的编码和解码对象:public static Encoder getEncoder(String encodingName) {
for (CodecSet cp : codecSetLoader) {
Encoder enc = cp.getEncoder(encodingName);
if (enc != null)
return enc;
}
return null;
}
至此对于spi的一个实现的,就大功告成啦!!!
附上项目结构:
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
### 基于NRF24L01无线SPI通信协议的理解及VC++...通过具体的C语言程序实例,不仅加深了对SPI通信机制的理解,还通过实践检验了通信的正确性。这对于学习嵌入式系统开发和无线通信技术的人来说是非常有帮助的参考资料。
Java SPI(Service Provider Interface)技术是Java中的一种服务提供接口机制,它允许开发者提供一个接口,而由其他开发者来提供实现。这种机制可以使得应用程序更加灵活和可扩展。 SPI技术的核心是ServiceLoader类...
单片机在执行保护动作后,可以通过通信接口(如I2C、SPI或UART)向其他模块发送信号,例如上位机或远程监控系统,以便进一步诊断和处理。 7. 软硬件协同设计 为了提高系统的可靠性和灵活性,过流保护电路不仅需要...
### 数字信号处理之深入浅出谈 #### 一、数字信号处理(DSP)基础知识 数字信号处理(Digital Signal Processing, DSP)是一种通过数学运算来分析、修改信号以获得信息或者改进信号质量的技术。它广泛应用于通信、...
- **硬件接口**:掌握串口、I2C、SPI等常用接口的使用方法。 - **调试技术**:熟悉使用JTAG/SWD等工具进行硬件调试的方法。 #### C语言嵌入式系统编程修炼 - **背景篇**:介绍了嵌入式系统的基本概念和发展历史,...
- 熟悉SPI、I2C等串行通信协议。 - 学习如何进行低功耗设计。 - 理解ADC(模数转换器)和DAC(数模转换器)的使用。 - 如何进行代码调试和性能优化? #### 5. C语言嵌入式系统编程修炼系列 **修炼系列概览** ...