偶然间看到SPI这个名词,之前知道API,但是SPI还没怎么接触过,打算找些资料看看。
API和SPI的区别是啥?
API全称是Application Programming Interface,应用程序接口,我们在写java代码的时候,定义接口,是非常常见的事情。SPI的全称是Service Provider Interface,作为普通的开发人员大都不怎么熟悉,因为SPI主要针对厂商或者插件来搞的。
框架提供API及其实现,框架在实现过程中提供SPI回调机制。SPI是框架的扩展点,如果使用方要扩展框架,可以自己实现SPI并注入框架,于是框架使用方其实也是一个服务提供商。
简单描述,就是API是给使用者用的,而SPI是给扩展者用的。
API是针对功能的抽象描述,SPI是针对变化的。
我们在设计系统的时候,会抽象出不同模块,例如日志模块、数据库连接模块,在面向对象的设计中,一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。为了实现在模块装配的时候能在程序里动态指明,就需要一种服务发现机制,有点类似IOC的思想,将装配的控制权移到程序之外。
框架如何发现SPI?
通过java中的ServiceLoader类来发现SPI,此类负责加载Service,
介绍地址如下:http://docs.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html
应用或者第三方如何注入SPI的实现?
在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件,这个文件中就是实现该服务接口的具体实现类的完全限定名,而当框架调用ServiceLoader.load方法时,就能通过jar中的文件找到具体的实现类名,并装载实例化,完成SPI的注入。
构建SPI的步骤是啥?
1、在jar中的META-INF/services目录中,放置文件,然后jar包放在classpath下面;
2、文件名为要扩展的接口包路径全名。文件内部为接口实现类,格式为utf-8;
3、使用JDK标准载入类,ServiceLoader来加载;
-----------------------------------------------------------------------------------------
一个实例
1、定义接口People,接口中有一个方法
People.java
1
2
3
4
|
package com.iamzhongyong;
public interface People {
public void printMyName();
} |
2、搞两个实现类,这里SPI的实现是框架自己
APeopleImpl.java
1
2
3
4
5
6
7
8
|
package com.spi.impl;
import com.iamzhongyong.People;
public class APeopleImpl implements People {
@Override
public void printMyName() {
System.out.println( "i am A people..." );
}
} |
BPeopleImpl.java
1
2
3
4
5
6
7
8
|
package com.spi.impl;
import com.iamzhongyong.People;
public class BPeopleImpl implements People {
@Override
public void printMyName() {
System.out.println( "i am B people..." );
}
} |
3、src目录下,构建META-INF/services目录,然后文件名为”com.iamzhongyong.People“
文件内容为此接口的两个实现类
1
2
|
com.spi.impl.APeopleImpl com.spi.impl.BPeopleImpl |
4、构建main函数,用ServiceLoader来加载实现类
1
2
3
4
5
6
7
8
9
10
|
import java.util.ServiceLoader;
import com.iamzhongyong.People;
public class MainSPI {
public static void main(String[] args) {
ServiceLoader<People> loaders = ServiceLoader.load(People. class );
for (People p : loaders){
p.printMyName();
}
}
} |
代码结构如下:
-------------------------------------------------------------------------------------------------------
debug代码
框架自己扩展关系图
第三方提供的SPI
参考文章:
http://docs.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html
http://stan001140.iteye.com/blog/1743874
相关推荐
学习如何使用单片机驱动液晶显示屏(LCD)显示文字和简单图形,这会涉及I2C或SPI通信协议、LCD控制器的使用以及字符库的设计。 5. **ADC转换**: 模数转换(ADC)是将模拟信号转化为数字信号的过程,这对于采集...
31. 语音识别:初步接触语音识别技术。 32. 自动化控制:如自动门、自动浇灌系统等。 33. 虚拟现实交互:通过单片机与VR设备交互。 34. 机器学习:在单片机上实现简单的机器学习算法。 35. IoT应用:构建物联网设备...
8. **RTOS(实时操作系统)初步接触**:学习如何在AVR单片机上运行简单的RTOS,实现多任务调度。 9. **存储器管理**:了解如何在AVR单片机中使用Flash和EEPROM存储数据。 10. **项目实战**:可能包括设计一个基于...
51单片机是最早流行的8位单片机,具有丰富的外部引脚和简单易用的指令系统。 2. 内部结构:了解51单片机的内部寄存器、数据存储区(如RAM和ROM)、程序计数器等,是编写有效程序的基础。 二、C语言编程 1. C语言...
14. **RTOS实时操作系统**:初步接触FreeRTOS等实时操作系统,了解任务调度、信号量、互斥锁等概念。 每个实例都提供了源代码,学习者可以通过下载这些源代码,在实际的单片机上进行仿真,以验证代码的正确性和理解...
这27个例子涵盖了STM32的基本功能和高级特性,包括GPIO、ADC、DAC、PWM、SPI、I2C、UART等接口的使用,以及实时操作系统(RTOS)的初步接触。 4. **个人学习ATMEGA8单片机应用及其仿真总结30例**:ATMEGA8是AVR系列...
- **实例71至实例72** 涉及到实时操作系统(RTOS)的初步接触,展示了如何管理和调度多任务,确保程序在资源有限的环境中高效运行。 ##### 实例73至实例80:硬件接口与外设驱动 - **实例73至实例76** 介绍了如何...
8. **应用实例**:提供简单的硬件连接图和代码示例,展示如何在实际项目中集成DS1302,进行初步的测试和验证。 9. **调试技巧**:分享一些在开发过程中可能遇到的问题及解决策略,帮助用户快速定位和解决问题。 10...
标题中的"stc51 stm32 中景园电子0-96寸OLED模块资料 大全.zip"表明这是一个关于微控制器编程的资源集合,主要涉及STC51和STM32芯片,以及0-96寸...无论是对单片机的初步接触,还是对OLED屏的应用拓展,都能从中受益。
学习时,会接触到汇编语言和C语言,这两种语言在单片机编程中各有优势,汇编语言能直接控制硬件,而C语言则提供了更高的抽象层次,便于编写复杂的程序。 二、硬件接口与外围设备 单片机往往需要与各种外围设备交互...
9. **RTOS(实时操作系统)的初步接触**:虽然51单片机资源有限,但也可以尝试实现简单的RTOS,例如FreeRTOS,了解任务调度、信号量等概念。 这个压缩包中的例程,对于初学者来说,是理论与实践相结合的最佳途径。...
9. **RTOS(实时操作系统)概念**:虽然可能不包含复杂的RTOS项目,但可以通过简单的任务调度和中断管理,初步接触这方面的知识。 10. **传感器与执行器**:通过连接各种传感器(如温度、湿度、光线、运动等)和...
6. **RTOS(实时操作系统)初步接触**:了解嵌入式系统中RTOS的作用,如FreeRTOS或CMSIS-RTOS,以及如何在STM32上移植和使用这些操作系统,提升系统的多任务处理能力。 7. **中断与定时器编程**:学习如何有效地...
郭天祥老师的教学资料包括课堂课件,这些课件详细阐述了以上各个知识点,并可能配有实例代码和实验指导,帮助学员快速理解和掌握单片机编程。通过系统的自学和实践,即使零基础的学员也能在十天内建立起对单片机的...
11. **RTOS概念**:初步接触实时操作系统,如FreeRTOS,学习任务调度、信号量、互斥锁等概念。 通过这100个实例,你可以逐步提升单片机编程技能,理解硬件与软件之间的交互,同时掌握Proteus仿真工具的使用,为未来...
9. **RTOS(实时操作系统)初步接触**:如FreeRTOS,增强多任务处理能力。 10. **电源管理**:优化能耗,适应电池供电设备。 通过这些实例,你可以: - 掌握ATMEGA8的寄存器配置和编程技巧。 - 学会如何通过仿真...
在学习过程中,"瑞萨单片机入门_RH850_F1"的相关资料会提供实例代码、电路图和详细解释,帮助初学者快速上手。记得理论结合实践,不断动手操作,才能更好地理解和掌握RH850单片机的使用。 总的来说,瑞萨RH850-F1K/...
电容式指纹识别技术是目前广泛应用的身份验证方法之一,尤其在智能手机、门禁系统和安全设备中占据主导地位。66319型号的电容指纹识别模块代表着一种高效、安全且用户友好的解决方案。 首先,我们要理解电容指纹...
软件仿真允许开发者在真实硬件部署前模拟程序运行,便于调试逻辑错误,无需实际硬件即可完成初步验证。 ##### 2.4 程序下载 将编译后的固件下载到STM32开发板的过程,通常通过JTAG或SWD接口完成,是硬件测试和软件...
理解MCU的最小系统,包括I/O口、串行通信、键盘、LED、LCD、SPI、I2C、PWM、A/D转换(如传感器)和D/A转换等基本模块的工作原理,通过实际操作来加强理解。编写这些硬件模块的驱动程序是嵌入式系统开发的基本功。 ...