API is a mean for accessing a provided service/function, SPI is way to inject, extend or alter the behavior.
API stands for Application Programming Interface, and is a mean for accessing a service/function provided by some kind of software or a platform. API is normally target for clients to access a service and its has the following properties:
- API is a programmatic way of accessing a service to achieve a certain behavior or output;
- from API evolution point of view, addition is no problem at all for clients;
- but API’s once utilized by clients it can not (and should not) be altered / deleted unless there are an appropriate communications, since its a complete degradation of the client expectation.
SPI stands for Service Provider Interface, and is way to inject, extend or alter the behavior for software or a platform. SPI is targeted for providers and has the following properties:
- SPI is a way to extend / alter the behavior of a software or a platform (programmable vs. programmatic);
- SPI evolution is different that API evolution, in SPI removal is not an issue;
- addition of SPI interfaces will cause problems and may break existing implementations.
Put differently, the API tells you what a specific class/method does for you and the SPI tells you what you must do to conform. So:
- the API is the description of classes/interfaces/methods/… that you call and use to achieve a goal;
- the SPI is the description of classes/interfaces/methods/… that you extend and implement to achieve a goal.
Usually API and SPI are separate. For example in JDBC the Driver class is part of the SPI: if you simply want to use JDBC, you don’t need to use it directly, but everyone who implements a JDBC driver must implement that class.
Sometimes they overlap, however. The Connection interface is both SPI and API: you use it routinely when you use a JDBC driver and it needs to be implemented by the developer of the JDBC driver.