偶然间看到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
相关推荐
SPI协议的简单实例说明,如果控制SPI总线,以一个主从机更换数据为例
SPI总线协议及SPI时序图详解含实例
基于LPC2138的简单实例,需要补充简单的几行代码即可运行,初学者可以尝试看一看
SPI的简单示例,SPI的简单示例,SPI的简单示例
SPI通信协议及实例打包SPI通信协议及实例打包SPI通信协议及实例打包SPI通信协议及实例打包SPI通信协议及实例打包
STM32实例程序 17.SPI_test_SPI实验STM32实例程序 17.SPI_test_SPI实验STM32实例程序 17.SPI_test_SPI实验STM32实例程序 17.SPI_test_SPI实验STM32实例程序 17.SPI_test_SPI实验STM32实例程序 17.SPI_test_SPI实验...
avr SPI程序实例avr SPI程序实例avr SPI程序实例
飞思卡尔 SX128 SPI 通信实例
wince 5.0 下的SPI应用的简单例子 MFC 定时器100ms通过SPI0和SPI1定时发送数据
spi程序实例,是pic单片机的程序
SPI是英文Serial Peripheral Interface的缩写,中文意思是串行外围设备接口,SPI是Motorola公司推出的一种同步串行通讯方式,是一种三线同步总线,因其硬件功能很强,与SPI有关的软件就相当简单,使CPU有更多的时间...
STM32 F103 通过SPI口读取RFID的例子,分别用SPI1和SPI2读取RFID
在Xilinx新一代的FPGA中增加了SPI和BPI配置模式,好处是成本低、设计者选择余地大及配置方便等优点。例如,Spartan-3E器件支持多种Vendor(生产商)提供的SPI和BPIFlash产品。对于SPI Flash器件可以通过Xilinx的Cable-...
java spi简单参考,url:https://blog.csdn.net/a925907195/article/details/87088744 主类:testcase,代码很简单,只是自己写个demo看看运行原理
简单实用的SPI通信教程
本文针对TI的davinci芯片DM6467和嵌入式Linux操作系统构建的开发平台,分析了DM6467的SPI接口特性,寄存器作用,以及初始化过程。并根据接口电路的连接特点说明了SPI设备驱动程序的基本开发方法。
SPI抛光规范(SPI A1-SPI D3)
配合本人所写FPGA教学文章使用,详见编写简单的testbench第二篇。
一个重写SPI的小例子,希望对大家学习有所帮助