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,然后程序在运行时根据加载到的接口实现不同,实现不同具体的功能,如操作不同的数据库。

  • 相关阅读:
    10个用jQuery实现图片幻灯片/画廊效果和源码
    老赵面试题参考答案(二)
    C#的显式接口和隐式接口
    老赵面试题参考答案(三)
    C#中的参数传递:值类型(value type)和引用类型(reference type)
    word转换成html的方法
    老赵面试题参考答案(四)
    五个Metro UI 风格的网页设计
    老赵面试题参考答案(六)
    概要设计怎么写?
  • 原文地址:https://www.cnblogs.com/doit8791/p/10748258.html
Copyright © 2011-2022 走看看