Java学习之SPI、JDBC、SpringFactoriesLoader、Dubbo-概述

时间:2024-07-20 15:37:30

SPI,Service Provider Interface,一种服务发现机制,指一些提供给你继承、扩展,完成自定义功能的类、接口或方法。

在SPI机制中,服务提供者为某个接口实现具体的类,而在运行时通过SPI机制,查找到对应的实现类,并将其加载进行使用。

JDK 6(参考java.util.ServiceLoader类的注释Since字段)引进的一个特性,可实现动态加载具体实现类的机制,通过它可以具体实现代码的解耦,也可实现类似于IoC的效果。

SPI的实现方式:提供实现的实现类打包成jar文件,jar文件里面必须有个META-INF/services目录,其下有一个文本文件,文件名即为SPI接口的全限定名(完整路径名),文件的内容是该jar包中提供的SPI接口的实现类名。文件编码是UTF-8。

作用有两个:

  • 把标准定义和接口实现分离,在模块化开发中很好地实现解耦
  • 实现功能的扩展,更好地满足定制化的需求

SPI的不足之处:不能根据需求去加载扩展实现,每次都会加载扩展接口的所有实现类并进行实例化,实例化会造成性能开销,并且加载一些不需要用到的实现类,会导致内存资源的浪费。

API和SPI

API,提供给他人使用的具备某项功能的类、接口或方法。

SPI用于一些通用的标准中,为标准的实现产商提供扩展点。标准在上层提供API,API内部使用SPI,当API被客户使用时,会动态得从当前运行的classpath中寻找该SPI的实现,然后使用该SPI的实现来完成API的功能。