SPI有两个不同的扩展名。

第一种 :SPI(Serial Peripheral interface)串行外围设备接口(总线)。

SPI优点

支持全双工通信
通信简单
数据传输速率块

缺点
没有指定的流控制,没有应答机制确认是否接收到数据,所以跟IIC总线协议比较在数据 
可靠性上有一定的缺陷。

特点
1):高速、同步、全双工、非差分、总线式
2):主从机通信模式

第二种 SPI(Service Provider Interface)服务提供接口。

简单来讲,即通过注册接口的实现类调用对应的类。mysql-connector驱动包就是使用SPI机制。

比如有个接口AI,然后有三个实现类A1,A2,A3.我们在META-INF文件夹下建立一个Service,然后在下面建立一个与接口同名的文件AI,在

此文件中写入A2,A3的类路径地址。这样在开始调用时,通过ServiceLoader从Service下获取接口对应的需要载入的类路径,然后通过反射机制获取对应加载的类,

如果不想用A2,A3,想用A1了直接修改文件即可,实现快速插拔。

/**
 * Spi(service procedure interface)
 * @author DennyZhao
 *
 */
public class SpiTest {

    public static void main(String[] args) {
        ServiceLoader<Animals> serviceLoader =  ServiceLoader.load(Animals.class);
        Iterator<Animals> iterator = serviceLoader.iterator();
        while(iterator.hasNext()) {
            Animals animals = iterator.next();
            System.out.println(animals.getAnimalName());
        }
    }
}

接口和实现类以及Service结构,由于ServiceLoader默认使用接口的路径和类名查找文件,因此确保文件名和接口路径一致:

在文件中填写:

com.test.animal.impl.Sheep
com.test.animal.impl.Tiger

即完成了实现类的注入。

 

posted on 2018-07-11 09:05  zhaoqiang1980  阅读(143)  评论(0编辑  收藏  举报