SPI介绍
SPI定义
SPI ,全称为 Service Provider Interface,是一种服务发现机制,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 SPI的作用就是为这些被扩展的API寻找服务实现。
SPI使用
SPI 是调用方来制定接口规范,提供给外部来实现,调用方在调用时则选择自己需要的外部实现。 从使用人员上来说,SPI 被框架扩展人员使用。
SPI实现
JDK的默认实现为ServiceLoader
通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。
SPI在soul网关中的应用
spi机制在soul(参考了dubbo实现)的divide插件中有使用,主要用在负载均衡算法的选择上,如图:
进入到LoadBalanceUtils.selector方法中,如图:
该方法是通过给定的算法字符串获取对应的算法实例,其中LoadBalance为接口,对应有三个实现方法
这里,soul中对spi进行了扩展实现,
加载对应目录下的属性文件,文件名为接口全路径(org.dromara.soul.plugin.divide.balance.LoadBalance),文件内容为
random=org.dromara.soul.plugin.divide.balance.spi.RandomLoadBalance
roundRobin=org.dromara.soul.plugin.divide.balance.spi.RoundRobinLoadBalance
hash=org.dromara.soul.plugin.divide.balance.spi.HashLoadBalance
ExtensionLoader会根据传递的算法名称匹配属性文件里的key,进而找到实现类进行类实例化,
在扩展类加载器方面,新增了两个注解,即SPI和Join注解,应用时,需要使用SPI机制的接口要打上SPI注解,对应的相关实现类,需要打上Join注解
与JDK版本的SPI比较
- 文件内容的变化,jdk版本默认文件内容为实现类,soul中,已经将其该为key和value,value对应的实现类,好处是应用程序可以根据key来筛选实现类
- jdk版本默认版本的类加载器是非线程安全的,soul的中自定义类加载器已经将其改为线程安全
- 由于soul中的spi参考了dubbo的实现,将其简化,实际在dubbo中有扩展的工厂类加载器,可以加载除了本地实例化的类之外,还可以加载被spring托管的bean等。
版权声明:本文为yilongzhetian原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。