0Pricing
Java Academy · Leçon

Services avec provides/uses

Découplez avec le chargeur de services

Services avec provides/uses est une leçon Java Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Java Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Java Academy comprend 4 leçons au total.

Découplage grâce aux services

Les modules peuvent collaborer sans dépendre des implémentations des uns et des autres grâce au modèle du chargeur de services.

Un module déclare qu’il uses une interface de service ; un autre déclare qu’il provides une implémentation. La JVM les relie.

Les trois rôles

Un service compte trois participants :

  • Interface de service : le contrat, situé dans un module quelconque
  • Fournisseur : un module qui fournit une implémentation
  • Utilisateur : un module qui charge les implémentations à l’exécution

L’interface de service

Commencez par définir le contrat. Il s’agit simplement d’une interface normale dans un paquet exporté, afin que les fournisseurs comme les utilisateurs puissent y faire référence.

package com.example.spi;

public interface Codec {
    String name();
    byte[] encode(String input);
}

L’utilisateur déclare l’utilisation

Le module utilisateur déclare qu’il uses l’interface. Cela indique à JPMS que le module recherchera les implémentations via ServiceLoader.

module com.example.app {
    requires com.example.spi;
    uses com.example.spi.Codec;
}

Le fournisseur déclare la fourniture

Un module fournisseur déclare l’interface qu’il implémente avec provides ... with ..., en nommant sa classe concrète.

module com.example.base64 {
    requires com.example.spi;
    provides com.example.spi.Codec
        with com.example.base64.Base64Codec;
}

L’implémentation du fournisseur

La classe d’implémentation est du Java ordinaire. Elle doit être publique et disposer soit d’un constructeur public sans argument, soit d’une méthode statique publique 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());
    }
}

Charger avec ServiceLoader

À l’exécution, l’utilisateur demande à ServiceLoader.load(Codec.class) tous les fournisseurs disponibles et les parcourt, sans liaison à la compilation avec aucune implémentation.

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());
        }
    }
}

Pourquoi c’est puissant

Le module utilisateur ne nomme jamais la classe d’un fournisseur. Ajoutez un nouveau module fournisseur au chemin des modules et il est découvert automatiquement.

Cela permet de créer des architectures à extensions et une inversion propre des dépendances.

La fabrique d’instances

Si la construction nécessite une logique particulière, exposez plutôt une méthode statique publique provider() qu’un constructeur sans argument. JPMS l’appelle pour obtenir l’instance.

package com.example.base64;

import com.example.spi.Codec;

public class CodecFactory {
    public static Codec provider() {
        return new Base64Codec();
    }
}

Plusieurs fournisseurs

De nombreux modules peuvent chacun fournir la même interface. ServiceLoader les renvoie tous, ce qui permet à votre module utilisateur de choisir selon le nom, la priorité ou les capacités.

Ajoutez ou supprimez des fournisseurs sans modifier le code du module utilisateur.

Flux de fournisseurs

Depuis Java 9, ServiceLoader propose stream(), qui fournit des objets Provider que vous pouvez filtrer avant de les instancier, ce qui est utile lorsque la construction est coûteuse.

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());
    }
}

Vérification rapide

Rappelez-vous quelle directive chaque rôle utilise.

Récapitulatif

Vous avez appris le modèle de services des modules :

  • Trois rôles : interface de service, fournisseur, utilisateur
  • Utilisateur : uses ; fournisseur : provides ... with
  • Implémentations chargées à l’exécution via ServiceLoader
  • Les fournisseurs ont besoin d’un constructeur public sans argument ou d’une méthode statique provider()

Ensuite : migrer un projet existant vers les modules.

Questions Fréquemment Posées

La leçon « Services avec provides/uses » est-elle gratuite ?

Oui — le texte complet de « Services avec provides/uses » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Java Academy, passe à CoddyKit PRO. Le cours Java Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Services avec provides/uses » ?

Découplez avec le chargeur de services Tu pratiques Java Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Java Academy ?

Aucune expérience préalable n'est requise. Java Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.

Combien de temps prend la leçon « Services avec provides/uses » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Java Academy ?

Oui. Chaque leçon Java Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. module-info.java
  2. requires et exports
  3. Services avec provides/uses
  4. Migrer vers les modules
← Retour à Java Academy