Tjänster med provides/uses
Frikoppla med tjänsteladdaren.
Tjänster med provides/uses är en gratis lektion i Java Academy på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Java Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Java Academy innehåller totalt 4 lektioner.
Frikoppling med tjänster
Moduler kan samarbeta utan att vara beroende av varandras implementationer genom mönstret tjänsteladdare.
En modul deklarerar att den uses ett tjänstegränssnitt, medan en annan deklarerar att den provides en implementation. JVM kopplar ihop dem.
De tre rollerna
En tjänst har tre deltagare:
- Tjänstegränssnitt: kontraktet, i någon modul
- Leverantör: en modul som tillhandahåller en implementation
- Användare: en modul som läser in implementationer vid körning
Tjänstegränssnittet
Definiera först kontraktet. Det är ett vanligt gränssnitt i ett exporterat paket, så att både leverantörer och användare kan referera till det.
package com.example.spi;
public interface Codec {
String name();
byte[] encode(String input);
}Användaren deklarerar uses
Användarmodulen deklarerar att den uses gränssnittet. Det talar om för JPMS att modulen kommer att söka efter implementationer via ServiceLoader.
module com.example.app {
requires com.example.spi;
uses com.example.spi.Codec;
}Leverantören deklarerar provides
En leverantörsmodul deklarerar vilket gränssnitt den implementerar med provides ... with ... och anger sin konkreta klass.
module com.example.base64 {
requires com.example.spi;
provides com.example.spi.Codec
with com.example.base64.Base64Codec;
}Leverantörens implementation
Implementationsklassen är vanlig Java. Den måste vara offentlig och ha antingen en offentlig konstruktor utan argument eller en offentlig statisk metod provider().
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());
}
}Läsa in med ServiceLoader
Vid körning ber användaren ServiceLoader.load(Codec.class) om alla tillgängliga leverantörer och itererar över dem, utan någon kompileringslänk till en specifik implementation.
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());
}
}
}Varför detta är kraftfullt
Användaren namnger aldrig någon leverantörsklass. Placera en ny leverantörsmodul på modulvägen så upptäcks den automatiskt.
Detta möjliggör plugin-arkitekturer och en ren inversion av beroenden.
Fabriken provider()
Om konstruktionen kräver logik kan Ni exponera en offentlig statisk metod provider() i stället för en konstruktor utan argument. JPMS anropar den för att hämta instansen.
package com.example.base64;
import com.example.spi.Codec;
public class CodecFactory {
public static Codec provider() {
return new Base64Codec();
}
}Flera leverantörer
Många moduler kan var och en tillhandahålla samma gränssnitt. ServiceLoader returnerar alla, så att användaren kan välja efter namn, prioritet eller funktioner.
Lägg till eller ta bort leverantörer utan att ändra användarkoden.
Ström över leverantörer
Sedan Java 9 erbjuder ServiceLoader stream(), som ger Provider-referenser som kan filtreras innan instanser skapas. Det är användbart när konstruktionen är kostsam.
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());
}
}Snabb kontroll
Återkalla vilket direktiv varje roll använder.
Sammanfattning
Du har lärt dig modulernas tjänstemönster:
- Tre roller: tjänstegränssnitt, leverantör och användare
- Användare:
uses; leverantör:provides ... with - Implementationer läses in vid körning via
ServiceLoader - Leverantörer behöver en offentlig konstruktor utan argument eller statisk
provider()
Nästa steg: migrera ett befintligt projekt till moduler.
Lär dig Java med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 104
- Lektioner
- 374
Vanliga frågor
Är lektionen ”Tjänster med provides/uses” gratis?
Ja – hela texten till ”Tjänster med provides/uses” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Java Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Java Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Tjänster med provides/uses”?
Frikoppla med tjänsteladdaren. Ni övar på Java Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Java Academy?
Du behöver inga förkunskaper. Utbildningen i Java Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.
Hur lång tid tar lektionen ”Tjänster med provides/uses”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Java Academy-lektionen?
Ja. Varje Java Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- module-info.java
- requires och exports
- Tjänster med provides/uses
- Migrera till moduler