API/SPI可拓展性设计

API:API(Application Programming Interface)表示应用程序编程接口。SPI:SPI(Service Provider Interface)表示服务提供商接口。
API与SPI的关系

框架提供API及其实现,框架在实现过程中提供SPI回调机制。SPI是框架的扩展点。如果使用框架方要扩展框架,可以自己实现SPI并注入框架,于是框架使用方其实也是一个服务提供商。SPI实现有两种方式,一种是第三方提供实现,另一种是应用自身自己提供实现。

看一下API/SPI关系图1,第三方提供商实现了SPI,应用引入第三方提供商的第三方库。

举例

java中JDBC是一个编程接口,而Driver是一个SPI,同时不同数据库厂商会提供Driver的实现。应用中要使用JDBC编程接口时需要引入第三方数据库厂商驱动包,第三方厂商提供的驱动包其实就是SPI的实现。

看一下API/SPI关系图1,应用自身为了扩展框架自己实现了SPI,直接在自己的应用包里实现SPI

框架如何发现SPI?

框架可以使用java提供的java.util.ServiceLoader类得到SPI的实现。
ServiceLoader<PullToolFactory> pullToolFactorys     = ServiceLoader.load(PullToolFactory.class);

应用或第三方提供商如何注入SPI实现?

应用或第三方包在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类的完全限定名。而当框架调用ServiceLoader.load(PullToolFactory.class),就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成SPI实现的注入。

总结:

可以想象,使用SPI设计,框架可以很容易引入扩展点,同时应用要扩展框架逻辑也很容易实现。框架可扩展设计可以基于这个原则进行设计扩展点。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值