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 SPI 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.