Java spi服务发现机制
1.简介
SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。 目前有不少框架用它来做服务的扩展发现,简单来说,它就是一种动态替换发现的机制,举个例子来说,有个接口,想运行时动态的给它添加实现,你只需要添加一个实现。
SPI 是JDK的一种标准,我们需要遵循它的规范,就是提供一个文件用来描述实现类的集合。
2.API和SPI的区别
API:提供给调用方,完成某项功能的接口,一般被实际调用的函数是固定的,可扩展性差。 SPI:是一种callback的思想,在一些通用的标准中(即API),为实现厂商提供扩展点。当API被调用时,会动态加载SPI路由到特定的实现中。如果结合一些消息订阅推送框架可以实现动态更改内部实现方式,而不用重新编译部署。
3.SPI现实应用场景
java.sql.Driver的spi实现,有mysql驱动、oracle驱动等。以mysql为例,实现类是com.mysql.jdbc.Driver,在mysql-connector-java-5.1.6.jar中,我们可以看到有一个META-INF/services目录,目录下有一个文件名为java.sql.Driver的文件,其中的内容是com.mysql.jdbc.Driver。
4.总结
没有抛出example代码,网上一搜一大把,没有必要。
其实SPI思想就是插件思想,从最早的eclipse使用OSGI,到现如今的SPI机制,我们都是想从技术出发把繁琐的定制化的业务剥离出来,使业务可以单独做自己的事,达到高内聚低耦合,重复利用代码,减少冗余。
但是SPI高度抽象,在加上一些框架基于spi实现了自己的一些业务隔离框架导致新手在阅读研究代码的困难程度指数飙升,这里有一个简单的降低学习成本的办法,开发一个代码的spi描述地图(直接从配置文件即可完成可视化,当然也没有那么简单具体的依赖关系复杂程度还是要根据框架是怎么实现的)。