Introduction to SPI
The SPI is all called (Service Provider Interface), a service discovery mechanism built into the JDK.
A service usually refers to a known interface or abstract class, the service provider is the implementation of the interface or abstract class, and then stored in the resource path Meta-inf/services directory according to the SPI standard, the file is named the fully qualified name of the service interface. If you have a service interface:
Package Com.ricky.codelab.spi;
Public interface Demoservice {public
string Sayhi (String msg);
Its service implementation classes are:
Package Com.ricky.codelab.spi.impl;
Import Com.ricky.codelab.spi.DemoService;
public class Demoserviceimpl implements Demoservice {
@Override public
string Sayhi (String msg) {return
" Hello, "+MSG;
}
}"
It needs to be in meta-inf/at this time Services to create a file named Com.ricky.codelab.spi.DemoService, where the content is the fully qualified name of the implementation class: Com.ricky.codelab.spi.impl.DemoServiceImpl.
If the service is implemented with multiple services, each line writes a service implementation (#后面的内容为注释), and the file can only be encoded in UTF-8.
Then, we can pass Serviceloader.load (class Class); To dynamically load the implementation class for the service.
Many development frameworks Use the Java SPI mechanism, such as Java.sql.Driver SPI implementations (MySQL-driven, Oracle-driven, etc.), common-logging log interface implementations, Dubbo extension implementations, and so on. the agreement of the SPI mechanism creates a file named in the meta-inf/services/directory with a fully qualified service interface, which contains the fully qualified name of the service interface, and the file encoding must be UTF-8. Use Serviceloader.load (class Class); Dynamically load the implementation class of the service interface. If the implementation class for the SPI is a jar, it needs to be placed under the classpath of the current program. The specific implementation class of the service must have a construction method with no parameters. Sample Development Environment JDK 1.7 IntelliJ Idea Maven 3.3.9 1, Project structure
2. Service Interface Definition
Package Com.ricky.codelab.spi;
Public interface Demoservice {public
string Sayhi (String msg);
3, Service Interface implementation class
In this example, there are two implementation classes, Demoservice: Englishdemoserviceimpl and Chinesedemoserviceimpl, with the following code:
Englishdemoserviceimpl.java
Package Com.ricky.codelab.spi.impl;
Import Com.ricky.codelab.spi.DemoService;
public class Englishdemoserviceimpl implements Demoservice {
@Override public
string Sayhi (String msg) {
Return "Hello," +msg
}
}
Chinesedemoserviceimpl.java
Package Com.ricky.codelab.spi.impl;
Import Com.ricky.codelab.spi.DemoService;
public class Chinesedemoserviceimpl implements Demoservice {
@Override public
string Sayhi (String msg) { return
"Hello," +msg;
}
meta-inf/services/Configuration
Create the meta-inf/services/directory under Src/main/resources, and make a new Com.ricky.codelab.spi.DemoService file that reads as follows:
#English implementation
Com.ricky.codelab.spi.impl.EnglishDemoServiceImpl
#Chinese Implementation
Com.ricky.codelab.spi.impl.ChineseDemoServiceImpl
Load Service Implementation class
Import Java.util.Iterator;
Import Java.util.ServiceLoader;
Import Com.ricky.codelab.spi.DemoService;
serviceloader<demoservice> Serviceloader = Serviceloader.load (demoservice.class);
Iterator<demoservice> it = Serviceloader.iterator ();
while (It!=null && it.hasnext ()) {
Demoservice demoservice = It.next ();
System.out.println ("Class:" +demoservice.getclass (). GetName () + "* *" +demoservice.sayhi ("World"));
}
Run Result:
Class:com.ricky.codelab.spi.impl.demoserviceimpl***hello, World
Hello, class:com.ricky.codelab.spi.impl.chinesedemoserviceimpl***.
code Download
Code has been uploaded to GitHub, Link: https://github.com/FBing/java-SPI-samples