一、spi(Service Provider Interface)介绍
定义一套统一的接口规范,通过第三方厂商去实现。厂商已经将接口进行实现,并将实现的全路径防止在jar包的指定目录下。
当使用的时候只需要将要实现的jar包引入到项目中,jdk会使用java.util.ServiceLoader类,通过到指定位置,
根据全路径的名称使用classLoader对实现类进行加载。
二、spi需要遵循的标准
1、需要统一的加载目录:resources/META-INF/services
2、在services目录下创建一个配置文件,满足:
1)、文件名是扩展(接口实现)的接口的全名
2)、文件内部的内容是实现接口的实现类的全路径
3)、文件的编码必须为UTF-8
3、java.util.ServiceLoader(使用该类,通过到指定位置,根据全路径的名称使用classLoader对实现类进行加载)
三、java spi的缺点
1、当引入了多个实现的时候,会一次性将所有的实现全部进行加载,若扩展实现存在很多消耗很大并并且在项目中没有使用到,则是完全的浪费。
2、扩展的实现点加载失败,会导致整个方法不能进行调用(并且问题很难进行跟踪查找)。
四、spi机制(思想)的应用
1、jdk提供的Driver(数据库链接,jdk中只是提出了规范,mysql或者oracle等厂商进行实现)
2、dubbo (dubbo对原生的Java spi进行了改进,所有的模块)
1)、 dubbo中实现是使用key、value的形式,中间使用extension的转化,所以不会对所有的实现进行加载
2)、并且实现了spi的注解方式,非常方便
3、spring
4、spring boot 中的factories