`
iamzhongyong
  • 浏览: 805399 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

SPI初步接触和简单例子

    博客分类:
  • java
 
阅读更多

     偶然间看到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

 

 

1
1
分享到:
评论

相关推荐

    单片机几个经典实例分享

    学习如何使用单片机驱动液晶显示屏(LCD)显示文字和简单图形,这会涉及I2C或SPI通信协议、LCD控制器的使用以及字符库的设计。 5. **ADC转换**: 模数转换(ADC)是将模拟信号转化为数字信号的过程,这对于采集...

    单片机35个实例精讲

    31. 语音识别:初步接触语音识别技术。 32. 自动化控制:如自动门、自动浇灌系统等。 33. 虚拟现实交互:通过单片机与VR设备交互。 34. 机器学习:在单片机上实现简单的机器学习算法。 35. IoT应用:构建物联网设备...

    AVR单片机C语言程序设计实例精粹

    8. **RTOS(实时操作系统)初步接触**:学习如何在AVR单片机上运行简单的RTOS,实现多任务调度。 9. **存储器管理**:了解如何在AVR单片机中使用Flash和EEPROM存储数据。 10. **项目实战**:可能包括设计一个基于...

    单片机编程实例100

    51单片机是最早流行的8位单片机,具有丰富的外部引脚和简单易用的指令系统。 2. 内部结构:了解51单片机的内部寄存器、数据存储区(如RAM和ROM)、程序计数器等,是编写有效程序的基础。 二、C语言编程 1. C语言...

    单片机C语言应用100例+源代码和仿真

    14. **RTOS实时操作系统**:初步接触FreeRTOS等实时操作系统,了解任务调度、信号量、互斥锁等概念。 每个实例都提供了源代码,学习者可以通过下载这些源代码,在实际的单片机上进行仿真,以验证代码的正确性和理解...

    单片机毕业设计资料2.rar

    这27个例子涵盖了STM32的基本功能和高级特性,包括GPIO、ADC、DAC、PWM、SPI、I2C、UART等接口的使用,以及实时操作系统(RTOS)的初步接触。 4. **个人学习ATMEGA8单片机应用及其仿真总结30例**:ATMEGA8是AVR系列...

    c语言单片机样例,适合初学者。

    - **实例71至实例72** 涉及到实时操作系统(RTOS)的初步接触,展示了如何管理和调度多任务,确保程序在资源有限的环境中高效运行。 ##### 实例73至实例80:硬件接口与外设驱动 - **实例73至实例76** 介绍了如何...

    102-DS1302.rar_ds1302

    8. **应用实例**:提供简单的硬件连接图和代码示例,展示如何在实际项目中集成DS1302,进行初步的测试和验证。 9. **调试技巧**:分享一些在开发过程中可能遇到的问题及解决策略,帮助用户快速定位和解决问题。 10...

    stc51 stm32 中景园电子0-96寸OLED模块资料 大全.zip

    标题中的"stc51 stm32 中景园电子0-96寸OLED模块资料 大全.zip"表明这是一个关于微控制器编程的资源集合,主要涉及STC51和STM32芯片,以及0-96寸...无论是对单片机的初步接触,还是对OLED屏的应用拓展,都能从中受益。

    单片机技术课程设计与项目实例

    学习时,会接触到汇编语言和C语言,这两种语言在单片机编程中各有优势,汇编语言能直接控制硬件,而C语言则提供了更高的抽象层次,便于编写复杂的程序。 二、硬件接口与外围设备 单片机往往需要与各种外围设备交互...

    51单片机例程

    9. **RTOS(实时操作系统)的初步接触**:虽然51单片机资源有限,但也可以尝试实现简单的RTOS,例如FreeRTOS,了解任务调度、信号量等概念。 这个压缩包中的例程,对于初学者来说,是理论与实践相结合的最佳途径。...

    30个单片机基础程序

    9. **RTOS(实时操作系统)概念**:虽然可能不包含复杂的RTOS项目,但可以通过简单的任务调度和中断管理,初步接触这方面的知识。 10. **传感器与执行器**:通过连接各种传感器(如温度、湿度、光线、运动等)和...

    STM32入门(中级篇上).rar

    6. **RTOS(实时操作系统)初步接触**:了解嵌入式系统中RTOS的作用,如FreeRTOS或CMSIS-RTOS,以及如何在STM32上移植和使用这些操作系统,提升系统的多任务处理能力。 7. **中断与定时器编程**:学习如何有效地...

    郭天祥十天学会单片机课件

    郭天祥老师的教学资料包括课堂课件,这些课件详细阐述了以上各个知识点,并可能配有实例代码和实验指导,帮助学员快速理解和掌握单片机编程。通过系统的自学和实践,即使零基础的学员也能在十天内建立起对单片机的...

    单片机C语言程序设计实训100例基于8051 Proteus仿真.rar )

    11. **RTOS概念**:初步接触实时操作系统,如FreeRTOS,学习任务调度、信号量、互斥锁等概念。 通过这100个实例,你可以逐步提升单片机编程技能,理解硬件与软件之间的交互,同时掌握Proteus仿真工具的使用,为未来...

    个人学习ATMEGA8单片机应用及其仿真总结30例资料.rar

    9. **RTOS(实时操作系统)初步接触**:如FreeRTOS,增强多任务处理能力。 10. **电源管理**:优化能耗,适应电池供电设备。 通过这些实例,你可以: - 掌握ATMEGA8的寄存器配置和编程技巧。 - 学会如何通过仿真...

    瑞萨RH850-F1K/L单片机入门资料

    在学习过程中,"瑞萨单片机入门_RH850_F1"的相关资料会提供实例代码、电路图和详细解释,帮助初学者快速上手。记得理论结合实践,不断动手操作,才能更好地理解和掌握RH850单片机的使用。 总的来说,瑞萨RH850-F1K/...

    电容指纹识别模块66319

    电容式指纹识别技术是目前广泛应用的身份验证方法之一,尤其在智能手机、门禁系统和安全设备中占据主导地位。66319型号的电容指纹识别模块代表着一种高效、安全且用户友好的解决方案。 首先,我们要理解电容指纹...

    对学习嵌入式系统的途径与基本方法的建议

    理解MCU的最小系统,包括I/O口、串行通信、键盘、LED、LCD、SPI、I2C、PWM、A/D转换(如传感器)和D/A转换等基本模块的工作原理,通过实际操作来加强理解。编写这些硬件模块的驱动程序是嵌入式系统开发的基本功。 ...

Global site tag (gtag.js) - Google Analytics