zoukankan      html  css  js  c++  java
  • Java扩展方法之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的实现。 

    框架如何发现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设计,框架可以很容易引入扩展点,同时应用要扩展框架逻辑也很容易实现。框架可扩展设计可以基于这个原则进行设计扩展点。 

    SPI设计的关键是程序定义通用的接口比如JDBC,然后不同服务提供商根据接口做自己的实现如Driver,然后程序在运行时根据加载到的接口实现不同,实现不同具体的功能,如操作不同的数据库。

  • 相关阅读:
    Vue 环境配置
    Vue-think脚手架
    搭建vue环境网站
    数组 还是 字符串
    javascript jquery console调试方法说明
    获取 stoken 或者id MVC写法
    它山之石
    Android学习笔记_44_apk安装、反编译及防治反编译
    (转)超级实用且不花哨的js代码大全
    Android学习笔记_43_网络通信之文件断点上传
  • 原文地址:https://www.cnblogs.com/doit8791/p/10748258.html
Copyright © 2011-2022 走看看