STRAT
Ride the Wind and Break the Waves | Set Sail with the Clouds
Today, let’s talk about the SPI mechanism in JAVA!!!
What exactly is SPI
SPI stands for Service Provider Interface and is widely used in major frameworks such as: JDBC, SLF4J, Dubbo, etc. It is an interface-oriented programming approach and serves as aservice discovery mechanism, allowing you to find specific implementations at runtime through interfaces without hardcoding the implementation class names in the code.

The main idea is to decouple, program based on interfaces, and use the strategy pattern combined with configuration files for dynamic injection, similar to Spring. This enhances both the extensibility and maintainability of the program.
Implementation Example
In IDEA, create a new standard Java project and write a GreetingService interface, which is the SPI, and DemoServiceImpl is the corresponding implementation.
public interface GreetingService { void greet(String name);}
public class EnglishGreetingService implements GreetingService { @Override public void greet(String name) { System.out.println("Hello, " + name + "!"); }}
public class ChineseGreetingService implements GreetingService { @Override public void greet(String name) { System.out.println("你好," + name + "!"); }}
Create a folder named META-INF/services under the src directory, and create a file with the package name + class name of the service interface GreetingService.
Folder name: src/main/resources/META-INF/services/com.example.spi.GreetingService
File content: (one per line)
com.example.spi.impl.EnglishGreetingService
com.example.spi.impl.ChineseGreetingService
Provide service loading (can also be packaged into a jar via Maven for third-party integration)
ServiceLoader<GreetingService> loader = ServiceLoader.load(GreetingService.class);
for(GreetingService service : loader) { service.greet("world");}
There is an important class called ServiceLoader, which is provided by the JDK. Its main function is to read all the files under the META-INF/services/ path from all loaded jars and instantiate theServiceProvider.
Disadvantages of SPI
Full loading of resources leads to resource waste. The native SPI mechanism instantiates all implementation classes listed under theMETA-INF/services/ path at once. If multiple implementation classes are listed in the configuration file but only one is needed at runtime, all will still be loaded and instantiated.
Loading failures are difficult to troubleshoot. The native SPI instantiates classes via reflection, and if there are issues such as missing constructor parameters, class not found, or incorrect names, these will only be exposed at runtime, and you won’t know which one to modify.
Not thread-safe. The JDK explicitly states that<span><span><span>ServiceLoader</span></span></span> instances are not thread-safe when accessed concurrently by multiple threads. The caller must add locks externally or use other means to ensure thread safety, increasing the cost of use.
Cannot select specific implementations as needed. The native SPI can only return an<span><span><span>Iterator</span></span></span> to iterate through all implementations, and cannot select a specific implementation based on name, conditions, priority, etc., like Spring. Therefore, when multiple implementation classes coexist, developers must judge, filter, and select in their logic, leading to a poor user experience.
No isolation or unloading capability. The implementation classes loaded by SPI are bound to the current ClassLoader and cannot be unloaded or replaced individually.If you want to upgrade or replace an implementation, you must restart the JVM, as hot updates and plugin isolation are not supported.
Conclusion
SPI is a simple, standard runtime extension mechanism, but the native implementation has many limitations, suitable for simple plugin scenarios. For complex requirements, it is recommended to encapsulate or replace it. You can check the principles of SPI extensions in Dubbo for more details.
If you found this article helpful,
like, view, and share.
Let’s discuss together, thank you for your support!



Long press the QR code to follow me for daily sharing of valuable content


