provides/uses ile Hizmetler
Hizmet yükleyiciyle bağımlılıkları ayırın
provides/uses ile Hizmetler, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
Hizmetlerle Gevşek Bağlama
Modüller, hizmet yükleyici desenini kullanarak birbirlerinin gerçekleştirmelerine bağımlı olmadan iş birliği yapabilir.
Bir modül bir hizmet arayüzünü uses ile kullandığını bildirir; başka bir modül ise bir gerçekleştirme provides ettiğini bildirir. JVM bunları birbirine bağlar.
Üç Rol
Bir hizmette üç katılımcı bulunur:
- Hizmet arayüzü: bir modülde bulunan sözleşme
- Sağlayıcı: bir gerçekleştirme sunan modül
- Tüketici: çalışma zamanında gerçekleştirmeleri yükleyen modül
Hizmet Arayüzü
Önce sözleşmeyi tanımlayın. Bu, hem sağlayıcıların hem de tüketicilerin başvurabilmesi için dışa açılmış bir pakette bulunan sıradan bir arayüzdür.
package com.example.spi;
public interface Codec {
String name();
byte[] encode(String input);
}Tüketici Kullanımı Bildirir
Tüketici modülü, arayüzü uses ile kullandığını bildirir. Bu, JPMS'ye modülün gerçekleştirmeleri ServiceLoader aracılığıyla arayacağını bildirir.
module com.example.app {
requires com.example.spi;
uses com.example.spi.Codec;
}Sağlayıcı Sağlama Bildirimi Yapar
Bir sağlayıcı modülü, hangi arayüzü gerçekleştirdiğini provides ... with ... ile bildirir ve somut sınıfının adını belirtir.
module com.example.base64 {
requires com.example.spi;
provides com.example.spi.Codec
with com.example.base64.Base64Codec;
}Sağlayıcı Gerçekleştirmesi
Gerçekleştirme sınıfı sıradan Java kodudur. Sınıf genel olmalı ve ya genel bir parametresiz oluşturucuya ya da genel bir statik provider() yöntemine sahip olmalıdır.
package com.example.base64;
import com.example.spi.Codec;
import java.util.Base64;
public class Base64Codec implements Codec {
public String name() { return "base64"; }
public byte[] encode(String input) {
return Base64.getEncoder().encode(input.getBytes());
}
}ServiceLoader ile Yükleme
Çalışma zamanında tüketici, kullanılabilir tüm sağlayıcıları istemek için ServiceLoader.load(Codec.class) çağrısını yapar ve bunlar arasında dolaşır; hiçbir gerçekleştirmeye derleme zamanı bağlantısı yoktur.
import com.example.spi.Codec;
import java.util.ServiceLoader;
public class App {
public static void main(String[] args) {
ServiceLoader<Codec> loader = ServiceLoader.load(Codec.class);
for (Codec codec : loader) {
System.out.println("Found codec: " + codec.name());
}
}
}Bu Neden Güçlü
Tüketici hiçbir sağlayıcı sınıfının adını vermez. Modül yoluna yeni bir sağlayıcı modülü eklediğinizde bu modül otomatik olarak bulunur.
Bu yaklaşım, eklenti mimarilerini ve bağımlılıkların temiz biçimde tersine çevrilmesini mümkün kılar.
Sağlayıcı Fabrikası
Oluşturma işlemi mantık gerektiriyorsa parametresiz oluşturucu yerine genel bir statik provider() yöntemi sunun. JPMS, örneği elde etmek için bu yöntemi çağırır.
package com.example.base64;
import com.example.spi.Codec;
public class CodecFactory {
public static Codec provider() {
return new Base64Codec();
}
}Birden Çok Sağlayıcı
Birçok modül aynı arayüzü sağlayabilir. ServiceLoader bunların tümünü döndürür; böylece tüketiciniz adı, önceliği veya yeteneği temelinde seçim yapabilir.
Tüketici koduna dokunmadan sağlayıcı ekleyebilir veya kaldırabilirsiniz.
Sağlayıcılar Üzerinde Akış
Java 9'dan beri ServiceLoader, örnek oluşturmadan önce filtreleyebileceğiniz Provider tutamaçları üreten stream() yöntemini sunar. Bu, oluşturma işlemi pahalı olduğunda kullanışlıdır.
import com.example.spi.Codec;
import java.util.ServiceLoader;
public class App {
public static void main(String[] args) {
Codec chosen = ServiceLoader.load(Codec.class).stream()
.map(ServiceLoader.Provider::get)
.filter(c -> c.name().equals("base64"))
.findFirst()
.orElseThrow();
System.out.println("Using: " + chosen.name());
}
}Hızlı Kontrol
Her rolün hangi yönergeyi kullandığını hatırlayın.
Özet
Modül hizmeti desenini öğrendiniz:
- Üç rol: hizmet arayüzü, sağlayıcı, tüketici
- Tüketici:
uses; sağlayıcı:provides ... with - Gerçekleştirmeler çalışma zamanında
ServiceLoaderaracılığıyla yüklenir - Sağlayıcıların genel bir parametresiz oluşturucuya veya statik bir
provider()yöntemine sahip olması gerekir
Sırada: mevcut bir projeyi modüllere taşıma.
Sıkça Sorulan Sorular
“provides/uses ile Hizmetler” dersi ücretsiz mi?
Evet — “provides/uses ile Hizmetler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“provides/uses ile Hizmetler” dersinde ne öğreneceğim?
Hizmet yükleyiciyle bağımlılıkları ayırın Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“provides/uses ile Hizmetler” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- module-info.java
- requires ve exports
- provides/uses ile Hizmetler
- Modüllere Geçiş