写本篇主要是用来后面写一篇可扩展性软件设计打好基础(苦于找不到一篇关于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
举例
我写了一个RenderAPI用来渲染vm模板, 渲染逻辑过程中会默认引入PullTool让vm中可以使用,如DateUtil,StringUtil等。应该可能想引入自己的业务PullTool,如MoneyTool等。于是我可以在RenderAPI接口的实现里,读取PullToolFacotry这个SPI,从这个SPI返回的PullTool加入到渲染引擎里。PullToolFacotry接口里就一个方法public Map<String PullTool> getPullTools();应用端可以写个类叫BusinessPullToolFactoryImpl实现PullToolFactory,把自己想要加入的PullTool返回即可。
框架如何发现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设计,框架可以很容易引入扩展点,同时应用要扩展框架逻辑也很容易实现。框架可扩展设计可以基于这个原则进行设计扩展点。
- 大小: 28.2 KB
- 大小: 28 KB
分享到:
相关推荐
这个规范旨在提供一种框架,使得不同的系统和平台能够有效地进行互操作,确保Web服务的互操作性和可扩展性。这里提到的文件列表包含了多个与WOSA相关的欧洲合作工作委员会(CEN Workshop Agreement, CWA)的标准文档...
### RESTful API 介绍与规范 #### RESTful 架构概览 RESTful(Representational State Transfer)是一种软件架构风格,而非严格意义上的技术标准...通过遵循RESTful 的设计原则,可以构建出更加灵活、可扩展的系统。
在Java API设计中,良好的设计规范对于创建可维护、易扩展和用户友好的软件至关重要。以下是一些关于Java API设计的重要原则和最佳实践: 1. **包设计**: - **分离API与实现**:推荐将API接口和其实现分别放在...
SPI 在 Java 中是一种常见的设计模式,它使得组件之间可以进行松耦合的交互,增强了软件的可扩展性和可维护性。 【描述】中的 "lassie.zip" 指的是另一个与 Datadog Screenboard REST API 相关的 Java 库。Datadog ...
- **可扩展性**:API应允许未来功能的添加而不会破坏现有结构。 - **引人注目**:API应具有吸引力,鼓励开发者采用。 3. **API设计流程**: - **需求收集**:分析用户需求,保持怀疑态度,寻找最佳解决方案。 -...
第18章 可扩展Visitor模式的案例 328 18.1 抽象类 331 18.2 为改进做好准备 333 18.3 默认的遍历 334 18.4 清楚地定义每个版本 337 18.5 单向改进 339 18.6 使用接口时的数据结构 340 18.7 ...
它们可以提供关于Linux内核结构、驱动程序设计原则以及特定硬件接口规范的信息,帮助开发者高效、正确地编写代码。 【SPI接口】 SPI(Serial Peripheral Interface)是一种同步串行接口,常用于连接微处理器与外围...
为了实现这种可扩展性,系统设计应遵循模块化原则,确保各部分之间松耦合。例如,STM32和ESP8266之间的通信协议应该简单且可靠,以便在添加更多设备时保持稳定。同时,云服务器端的架构也应具备高可扩展性,如采用...
该架构支持多个设备和服务提供商的集成,从而实现了高度的灵活性和可扩展性。 #### 四、BIO API 功能 BIO API 提供了一系列功能来支持生物识别操作,主要包括: 1. **Biometric Operations**:生物识别操作,包括...
为了确保系统的灵活性和可扩展性,设计遵循以下基本原则: 1. **最大化利用PC机软硬件资源**:利用PC机的强大计算能力和丰富的应用程序接口(API),提高整个系统的性能。 2. **模块化设计**:确保各个组成部分独立,...
- SPI扩展点加载涉及到编译器扩展、消息派发扩展、线程池扩展、序列化扩展、网络传输扩展、信息交换扩展、组网扩展、Telnet命令扩展、状态检查扩展。 - 其他如容器扩展、页面扩展、缓存扩展、验证扩展、日志适配扩展...
- 扩充式扩展与增量式扩展:讨论了如何设计可扩展的系统。 - 配置设计:系统应该具有灵活的配置能力,以适应不同的运行环境。 - 设计实现的健壮性:确保系统在各种情况下都能保持稳定运行。 - 防痴呆设计:设计时...
程序设计遵循模块化和层次化原则,分为SD卡底层驱动、文件系统、API接口和用户应用程序四个模块。其中,底层驱动负责SD卡的初始化和实际读写操作;文件系统则按照FAT32标准构建,能够进行文件的创建、读写和删除;...
这种机制增加了系统的灵活性和可扩展性。 - **2.5.7 更多关于 CannotProceedException 的信息** `CannotProceedException` 是在无法继续跨命名系统操作时抛出的异常。开发者需要了解如何正确处理这类异常,以避免...
在这个项目中,我们重点关注的是如何构建一个可重用、可扩展且高效能的Java模块,以便在多个应用程序之间共享资源和服务。 首先,我们要理解“公共资源模块”的概念。这通常指的是那些被多个组件或服务共同使用的...
5. **API与SPI机制**:SOFAArk 使用了Java的Service Provider Interface (SPI)机制,允许外部扩展其功能,增强了框架的可扩展性。 6. **类加载机制**:为了实现服务隔离,SOFAArk拥有自定义的类加载器设计,确保了...
在Java中,可以使用Java模块系统(Jigsaw项目)来实现模块化,它引入了模块声明(module-info.java)和模块间的依赖管理,提高了系统的可维护性和可扩展性。 2. **接口与实现分离**:公共资源模块通常提供公共API供...
因此,互联网系统的架构设计需侧重于可用性、安全性、高性能、可扩展性和成本控制。 5. 模块化设计:创建良好的架构首先要将系统拆分成足够细粒度的模块,然后用适当的方式连接这些模块,确保模块间解耦,以便于...