目录
1.什么是SPI
SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 SPI的作用就是为这些被扩展的API寻找服务实现。
SPI (Service Provider Interface)
是调用方
来制定接口规范,提供给外部来实现,调用方在调用时则
选择自己需要的外部实现。 从使用人员上来说,SPI 被框架扩展人员使用。
2.SPI的使用
package com.zy.context;
public interface MyServerSpi {
void say();
}
package com.zy.context;
/**
* @BelongsPackage: com.zy.context
* @Author: zy
* @CreateTime: 2022-09-16 15:39
* @Description: TODO
*/
public class ASpi implements MyServerSpi{
@Override
public void say() {
System.out.println("ASpi");
}
}
package com.zy.context;
/**
* @BelongsPackage: com.zy.context
* @Author: zy
* @CreateTime: 2022-09-16 15:38
* @Description: TODO
*/
public class BSpi implements MyServerSpi{
@Override
public void say() {
System.out.println("BSpi");
}
}
package com.zy.context;
import java.util.Iterator;
import java.util.ServiceLoader;
/**
* @BelongsPackage: com.zy.context
* @Author: zy
* @CreateTime: 2022-09-16 15:40
* @Description: TODO
*/
public class Test {
public static void main(String[] args) throws Exception {
ServiceLoader<MyServerSpi> serviceLoader = ServiceLoader.load(MyServerSpi.class);
Iterator<MyServerSpi> searchs = serviceLoader.iterator();
while (searchs.hasNext()) {
searchs.next().say();
}
}
}
在src/main/resources/META-INF/services/创建com.zy.context.MyServerSpi文件,文件内容如下:
打印结果:
3.源码分析:
1.简单的说就是通过流的方式判断文件中是否有内容并获取文件中的内容,三步走
2.
3.
4.
加载并生成对象
5.
6.
4.应用
jdbc 加载驱动:即使删除了 Class.forName("com.mysql.jdbc.Driver")这一行代码,也能加载到正确的驱动类