23 Nisan 2019 Salı

ServiceLoader Sınıfı - Service Provider Interface (SPI) İçindir

Giriş
Açıklaması şöyle
There are four important components in the Java SPI:

Service interface: An interface or abstract class that defines the methods of the class contract that the service provider implements.

Service Implementation: The implementation class that provides the service.

SPI configuration file: The filename must exist in the META-INF/services directory. The file name should be the same as the service provider interface fully qualified name. Each line in the file has an implementing service class detail, which is the fully qualified name of the service provider class.

ServiceLoader: Java SPI key class, used to load the service of the service provider interface. There are various utility methods in ServiceLoader for getting specific implementations, iterating over them, or reloading the service again.

Kullanım
1. Service interface java.sql.Driver olsun
2. META-INF/services/java.sql.Driver" isimli bir dosya yaratırız. Bu dosya SPI configuration file. Bu dosyaya Driver arayüzünü gerçekleştiren sınıfların tam yolunu yazarız
3. ServiceLoader ile gerçekleştirimleri yükleriz.

- Bu sınıf bulduğu nesneleri kendi içinde saklar. Dolayısıyla aynı nesneyi tekrar elde etmek için
singleton gibi kullanılması gerekiyor.

Kötü Tarafı - Anti Pattern
Açıklaması şöyle.
If an object uses a service locator to get its dependencies, your test framework will also need a service locator.
iterate metodu
Şöyle yaparız.
Iterator<IService> services = ServiceLoader.load(IService.class).iterator();
while (services.hasNext()) {
  IService service = services.next();
  ...
}
load metodu
Örnek
Şöyle yaparız.
ServiceLoader loader = ServiceLoader.load(Operation.class);
Örnek
Elimizde şöyle bir arayüz olsun
public interface Compresser {
  byte[] compress(byte[] bytes);
  byte[] decompress(byte[] bytes);
}
Şöyle bir dosya yaratırız
META-INF/services
Dosyanın içi şöyledir
cn.omgzui.demoserver.serviceproviders.GzipCompresser
cn.omgzui.demoserver.serviceproviders.ZipCompresser
Şöyle yaparız
ServiceLoader<Compresser> serviceLoader = ServiceLoader.load(Compresser.class);
for (Compresser service : serviceLoader) {
  ...
}


Hiç yorum yok:

Yorum Gönder