API
API (Application Programming Interface)在大多数情况下,都是实现方制定接口并完成对接口的实现,调用方仅仅依赖接口调用,且无权选择不同实现。
图源:Java基础之SPI机制
例如,厂商将自己的提供的服务写成接口,提供给其他开发人员使用。开发人员只需要调用相关接口,而不需要了解内部是什么。相当于我想实现什么功能我就调一下。
SPI
SPI(Service Provider Interface),是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 SPI的作用就是为这些被扩展的API寻找服务实现。
图源:Java基础之SPI机制
例如,我调用数据库的一些增删改查接口,但是不同的数据库底层实现机制可能不同,驱动程序也有不同。这就需要数据库厂商自己去实现自己的数据库驱动逻辑,我们只需要调用接口,不需要关心具体实现细节以及不同厂商之间的区别。
举例:高级开发必须理解的Java中SPI机制
实际上是基于接口的编程+策略模式+配置文件组合实现的动态加载机制。调用者根据实际使用需要,启用、扩展、或者替换框架的实现策略。
例子:
- 数据库驱动加载接口实现类的加载
- 日志门面接口实现类加载
- Spring中大量使用了SPI
- Dubbo中大量使用了SPI
SDK
SDK(Software Development Kit)即软件开发工具包 ,就是帮助我们开发出软件的工具集合,除了代码之外,一般还要搭配文档、示例等。
一般SDK都是需要引入到项目中使用的,比如JDK就是Java Development Kit,是一套用来开发Java的工具包,通过import语句来引入这个工具包。
SDK中可能提供很多的API供开发者使用。例如JDK中提供了很多用于IO处理(java.io)、容器工具(如java.util.concurrent)等,Windows SDK提供了很多Windows开发的相关工具和文档。
使用SDK的好处是,相当于复用别人的轮子,那么就对SDK的提供者需要有一些要求,如:命名简洁、统一风格、注释清晰、轻度依赖、可扩展、升级兼容、迁移平滑等等。
SDK除了包括提供的API,还包括运行/开发环境、编译器、调试器、测试分析工具等等。SDK的唯一访问入口是API,可以把SDK简单地理解为打包了一系列API的工具包。
参考
SDK 和 API 的区别是什么?
Java基础之SPI机制
大厂的 SDK 写法,偷学到了!
高级开发必须理解的Java中SPI机制