Service disini adalah suatu set dari beberapa interface atau beberapa class, dan provider (service provider) adalah implementasi spesifik dari suatu service.
Sebuah provider biasanya sebuah class berfungsi sebagai proxy dari semua operasi yang ada pada sebuah service. Provider haruslah tidak memiliki argumen pada constructor-nya, sehingga dapat diinisialisasi saat pencarian (lookup).
Sebuah provider-configuration file harus memiliki nama sesuai dengan nama (fully-qualified name) dari abstract service class. File tersebut berisi list dari provider-class konkrit yang ada dalam file JAR. Komentar dapat ditambahakan pada file dengan karakter '#'
Sebagai contoh, mari kita membuat sebuah class service pada suatu aplikasi dengan nama com.ejlp.spi.EncryptorProvider yang
memiliki method abstract sebagai berikut:
public abstract Encryptor getEncryptor(String s);
Kita dapat membuat suatu provider dalam file JAR yang terpisah dengan aplikasi dan mengimplementasikan abstract class com.ejlp.spi.EncryptorProvider. Misalnya kita membuat class com.ic.DESEncryptor sebagi provider:
public class DESEncryptor extends com.ejlp.spi.EncryptorProvider { public DESEncryptor() {} public abstract Encryptor getEncryptor(String s) { //... } }
Kemudian pada JAR file kita buat teks file META-INF/services/com.ejlp.spi.EncryptorProvider yang berisi line berikut
#Provider for DES encryptor com.ic.DESEncryptor
Pada aplikasi yang akan menggunakan provider, kita bisa membuat mekanisme seperti ini:
static { for (Iterator i = Service.providers(EncryptorProvider.class); i.hasNext(); ) { EncryptorProvider ep = (EncryptorProvider) i.next(); registerProvider(ep.class.getName, ep); } } registerProvider(String name, EncryptorProvider ep) { //... Add provider to a Map } Encryptor getEncryptor(String providerName) { //... get provider by its name, otherwise get default provider }
Links:
JAR File Specification
Bacaan bagus tentang service framework: Introduction to Services Framework