Java Academy · Les

Services met provides/uses

Ontkoppelen met de servicelader

Les 3 van 413 stappen

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.

Gratis beginnen

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

  1. module-info.java
  2. requires en exports
  3. Services met provides/uses
  4. Migreren naar modules
← Terug naar Java Academy