ServiceLoaderを使って、interfaceにclassをloadさせる
Provide-configurationにどのclassをloadするかを設定する
Hello.java
package sampleproject;
public interface Hello {
public String hello();
}
HelloImple.java
package lib;
import sampleproject.Hello;
public class HelloImpl implements Hello {
@Override
public String hello() {
return "Hello, SPI!";
}
}
SampleProject.java
package sampleproject;
import java.util.Iterator;
import java.util.ServiceLoader;
public class SampleProject {
public static void main(String[] args) {
Iterator<Hello> hellos = ServiceLoader.load(Hello.class).iterator();
while(hellos.hasNext()) {
Hello h = hellos.next();
System.out.println(h.hello());
}
}
}
provider-configuration
sampleproject.Helloというinterfaceにlib.HelloImpleをセットすることを意味する
META-INF\services\sampleproject.Hello
lib.HelloImpl
provider-configurationもclass-pathに含めるために事前にjar化
C:\Users\java\Documents\NetBeansProjects\SampleProject>jar cvf impl.jar build\classes\META-INF\services\sampleproject.Hello build\classes\lib\HelloImpl.class
マニフェストが追加されました
build/classes/META-INF/services/sampleproject.Helloを追加中です(入=13)(出=15)(-15%収縮されました)
build/classes/lib/HelloImpl.classを追加中です(入=394)(出=263)(33%収縮されました)
C:\Users\java\Documents\NetBeansProjects\SampleProject>java -cp build\classes;impl.jar sampleproject.SampleProject
Hello, SPI!