SPI是Java 1.5新添加的一个内置标准,允许不同的开发者去实现某个特定的服务。
一个Service就是一套著名的接口或抽象类,而Service Provider是这个Service的一个特定实现类。Service Provider按Service接口分类,同一个Service只能有一个实现类被注册。因为在实际中,Service都是单例的。如果同时注册了多了,后面的Service Provider将覆盖前面注册的Service Provider。
声明一个service provider需要在JAR包的META-INF目录下创建一个service子目录,并且为每一个service provider提供一个以Service全名命名的文件。假如JAR包有一个类com.mycompany.mypkg.MyServiceImpl实现了javax.someapi.SomeService接口,JAR包中应该包含一个文件:
META-INF/services/javax.someapi.SomeService
这个文件中包含一行:
com.mycompany.mypkg.MyService