Service-Provider-Interface in Java 6
How To ...
Dynamisches Laden und Verwenden von Services.
Hintergründe
Seit Version 6 enthält Java-SE die Klasse ServiceLoader, die die Verwaltung von Services vereinfacht. Ein Service wird allgemein als Interface oder abstrakte Klasse definiert. Verschiedene Implementierungen können über die Deklaration in einer Datei publiziert werden. Über den ServiceLoader wird auf die Implementierungen zugegriffen.
So geht's
Erstellen des Dienstes als Interface oder abstrakte Klasse
public interface SomeService {
public String upperCaseString(String str);
}
Entwicklung einer oder mehrerer implementierender Klassen, den Providern
public class MySpecialService implements SomeService {
@Override
public String upperCaseString(String str) {
return str.toUpperCase();
}
}
Deklaration der Provider in der Datei META-INF/services/<Interface-Name>
de.javahowto.java6.serviceloader.MySpecialService
Verwendung: Die Methode load(<Interface>) liefert alle registrierten Provider
ServiceLoader<SomeService> loader = ServiceLoader.load(SomeService.class);
for (SomeService provider : loader) {
// hier gibt es nur einen, ansonsten gewünschten bestimmen
System.out.println(provider.upperCaseString("Ein Test"));
}
