Services met provides/uses
Ontkoppelen met de servicelader
Services met provides/uses is een gratis Java Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Java Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Java Academy bevat in totaal 4 lessen.
Ontkoppeling met services
Modules kunnen samenwerken zonder afhankelijk te zijn van elkaars implementaties, met behulp van het patroon van de serviceloader.
Een module declareert dat deze een service-interface uses; een andere declareert een implementatie met provides. De JVM verbindt ze met elkaar.
De drie rollen
Een service heeft drie deelnemers:
- Service-interface: het contract, in een bepaalde module
- Aanbieder: een module die een implementatie levert
- Afnemer: een module die implementaties tijdens de uitvoering laadt
De service-interface
Definieer eerst het contract. Het is gewoon een normale interface in een geëxporteerd pakket, zodat zowel aanbieders als afnemers ernaar kunnen verwijzen.
package com.example.spi;
public interface Codec {
String name();
byte[] encode(String input);
}De afnemer declareert uses
De afnemermodule declareert dat deze de interface uses. Daarmee weet JPMS dat de module implementaties zal opzoeken via ServiceLoader.
module com.example.app {
requires com.example.spi;
uses com.example.spi.Codec;
}De aanbieder declareert provides
Een aanbiedermodule declareert welke interface deze implementeert met provides ... with ... en noemt daarbij de concrete klasse.
module com.example.base64 {
requires com.example.spi;
provides com.example.spi.Codec
with com.example.base64.Base64Codec;
}De implementatie van de aanbieder
De implementatieklasse is gewone Java-code. Deze moet openbaar zijn en een openbare constructor zonder argumenten of een openbare statische methode provider() hebben.
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());
}
}Laden met ServiceLoader
Tijdens de uitvoering vraagt de afnemer met ServiceLoader.load(Codec.class) alle beschikbare aanbieders op en doorloopt deze, zonder tijdens de compilatie aan een implementatie gekoppeld te zijn.
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());
}
}
}Waarom dit krachtig is
De afnemer noemt nooit een aanbiedersklasse. Plaats een nieuwe aanbiedermodule op het modulepad en deze wordt automatisch gevonden.
Zo worden plug-inarchitecturen en een nette omkering van afhankelijkheden mogelijk.
De fabriek provider()
Als het maken van een object logica vereist, stel je in plaats van een constructor zonder argumenten een openbare statische methode provider() beschikbaar. JPMS roept deze aan om het exemplaar te verkrijgen.
package com.example.base64;
import com.example.spi.Codec;
public class CodecFactory {
public static Codec provider() {
return new Base64Codec();
}
}Meerdere aanbieders
Veel modules kunnen elk dezelfde interface leveren. ServiceLoader retourneert ze allemaal, zodat je afnemer er een kan kiezen op basis van naam, prioriteit of mogelijkheden.
Voeg aanbieders toe of verwijder ze zonder de code van de afnemer aan te passen.
Een stream over aanbieders
Sinds Java 9 biedt ServiceLoader stream(), die Provider-handvatten oplevert die je vóór het maken van objecten kunt filteren. Dat is nuttig wanneer het maken ervan veel tijd kost.
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());
}
}Korte controle
Denk terug aan welke richtlijn elke rol gebruikt.
Samenvatting
Je hebt het moduleservicepatroon geleerd:
- Drie rollen: service-interface, aanbieder, afnemer
- Afnemer:
uses; aanbieder:provides ... with - Implementaties worden tijdens de uitvoering geladen via
ServiceLoader - Aanbieders hebben een openbare constructor zonder argumenten of een statische
provider()
Volgende: een bestaand project migreren naar modules.
Leer Java met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 104
- Lessen
- 374
Veelgestelde vragen
Is de les “Services met provides/uses” gratis?
Ja — de volledige tekst van “Services met provides/uses” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Java Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Java Academy bevat in totaal 4 lessen.
Wat leer ik in “Services met provides/uses”?
Ontkoppelen met de servicelader Je oefent met Java Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Java Academy te beginnen?
Ervaring vooraf is niet nodig. Java Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.
Hoe lang duurt de les “Services met provides/uses”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Java Academy?
Ja. Elke les over Java Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- module-info.java
- requires en exports
- Services met provides/uses
- Migreren naar modules