SPI机制

SPI机制是什么

SPI是Service Provider Interface 的简称,是服务提供者接口的意思,又称服务发现机制。SPI是一种动态替换发现的机制,是一种思想。

SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。

在面向的对象的设计里,一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。为了实现在模块装配的时候能不在程序里动态指明,这就需要一种服务发现机制。

图片[1]-SPI机制-深吸氧

SPI原理

在ClassPath路径下的META-INF/services文件夹中, 以接口的全限定名来命名文件名,文件里面写该接口的实现。然后再以资源加载的方式,读取文件的内容(接口实现的全限定名), 再去加载类。

SPI优点

  • SPI机制能够使接口与具体的实现类解耦,应用程序可以根据实际业务情况启用框架扩展或替换框架组件。
  • SPI机制为很多框架的扩展提供了可能。

SPI缺点

  • 通过遍历获取,接口的实现类会全部加载并实例化,如果你并不想用某些实现类,它也被加载并实例化,这就造成了浪费
  • 多个并发多线程使用ServiceLoader类的实例是不安全的

SPI案例

  • JDBC驱动加载案例:利用Java的SPI机制,我们可以根据不同的数据库厂商来引入不同的JDBC驱动包。
  • SpringBoot的SPI机制:我们可以在spring.factories中加上我们自定义的自动配置类,事件监听器或初始化器等。
  • Dubbo的SPI机制:Dubbo更是把SPI机制应用的淋漓尽致,Dubbo基本上自身的每个功能点都提供了扩展点,比如提供了集群扩展,路由扩展和负载均衡扩展等差不多接近30个扩展点。如果Dubbo的某个内置实现不符合我们的需求,那么我们只要利用其SPI机制将我们的实现替换掉Dubbo的实现即可。

Java自带的SPI演示

  1. 先定义一个SpiService接口
  2. 再定义一个SpiService接口的实现类SpiImpl
  3. 然后再在项目resources目录下新建一个META-INF/services文件夹,再新建一个以SpiService接口的全限定名命名的文件,文件内容为SpiImpl的全限定名
  4. 最后我们再新建一个测试类SpiTest看下效果
图片[2]-SPI机制-深吸氧
© 版权声明
THE END
请撒泡尿证明你到此一游
点赞7 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容