Spi 全称 Service Provider Interface. 即服务提供接口
其实就是为某个接口寻找服务的机制,有点类似IOC的思想,将装配的控制权移交给ServiceLoader。SPI在平时我们用到的会比较少,但是在Android模块开发中就会比较有用,不同的模块可以基于接口编程,每个模块有不同的实现service provider,然后通过SPI机制自动注册到一个配置文件中,就可以实现在程序运行时扫描加载同一接口的不同service provider。这样模块之间不会基于实现类硬编码,可插拔。
下面是一个栗子:
我们逐一讲解一下
![Android SPI的简单实现 Android SPI的简单实现](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzkyMC9lOWYwNzQ1NGE0YjZjMjljNDBmMDliOTJmYjIxNWJkOC5wbmc%3D.png?w=700&webp=1)
图1
通过图一可以看出这个工程中有4个module
app:主工程, intenfacdmodule 这里面定义了接口, mymodule1一个接口的实现module, mymodule2 另一个接口实现module
下面我们看一下他们的关联关系: 如下图2,3,4(仔细看 很关键)
![Android SPI的简单实现 Android SPI的简单实现](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgxNC9mNzQ1OWNlNmI2OTZlZDZkMWZhZDI4NmIxNzE1MDNmNi5wbmc%3D.png?w=700&webp=1)
图2
![Android SPI的简单实现 Android SPI的简单实现](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzkzOC9lOTI1Zjk1N2UxYjBlMGUwZGU5MTQ3NTAyMDI5NmQxMi5wbmc%3D.png?w=700&webp=1)
图3
![Android SPI的简单实现 Android SPI的简单实现](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE0OC9kYTdhNmFlZGQyNTUxZmUyZmY1OTQwM2U4YTQwMDcyYy5wbmc%3D.png?w=700&webp=1)
图4
下面我们将intenfacemodule 打开看看
![Android SPI的简单实现 Android SPI的简单实现](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzk3L2E4YTE1MDJkNjhkMTA1NDE3ZDU5OWFhNDUxMjYxYjg5LnBuZw%3D%3D.png?w=700&webp=1)
打开一个具体module 看看
![Android SPI的简单实现 Android SPI的简单实现](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzk5OS9hNjUxYmY5M2JjZGM1NmUwYmEzZjE2Yjc2ZWQ1YzkxNy5wbmc%3D.png?w=700&webp=1)
注意了 下面到重中之重了
![Android SPI的简单实现 Android SPI的简单实现](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMxMi8wNzVmYjc3ZDhmNmFjMmRjNTY1NWMxOTQzYzY1ZWVhOC5wbmc%3D.png?w=700&webp=1)
图中的这个文件是重点,所在路径如图,文件名 是实现接口的包名加类名
这个文件里的内容:
technical.guangbao.com.mymodule1.ImplA
实现类的包名+类名
![Android SPI的简单实现 Android SPI的简单实现](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzk5MS8yZGJmY2U5OWZjYWNjYWM4NDQyYmJjOWRiZDQ2MGNkZi5wbmc%3D.png?w=700&webp=1)
调用代码
ServiceLoader<MyInterface> serviceLoader = ServiceLoader.load(MyInterface.class);
Iterator<MyInterface> iterator = serviceLoader.iterator();
while (iterator.hasNext()){
MyInterface next = iterator.next();
next.send();
}
运行结果:
![Android SPI的简单实现 Android SPI的简单实现](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzUwMi85NTc3MThkMGRiZTllM2EyMzczMmI5YzRkNDc3MDFlZS5wbmc%3D.png?w=700&webp=1)
好了到此我们已经简单的实现了SPI
这样有什么好处呢?
这样我们上层代码一经写好 就不需要修改了, 根据不同的需求 替换不同的组件就可以了