Principe fondamental de l'Inversion de Contrôle (IoC) via injection par méthode setter

Qu'est-ce que l'IoC ?

L'Inversion de Contrôle (IoC) est un principe où le contrôle des opérations est transféré du développeur à un composant externe ou à l'utilisateur. Dans cet article, nous explorons une implémentation basique de l'IoC à travers l'injection de dépendances par méthode setter.

Mise en pratique

Commençons par définir une couche d'accès aux données (DAO) avec une interface et deux implémentations distinctes.

Interface de la couche DAO

package com.exemple.projet.persistence;

public interface AccesDonnees {
    void recupererUtilisateur();
}

Implémentation MySQL de la couche DAO

package com.exemple.projet.persistence;

public class AccesDonneesMysqlImpl implements AccesDonnees {
    @Override
    public void recupererUtilisateur() {
        System.out.println("Accès via MySQL");
    }
}

Implémentation Oracle de la couche DAO

package com.exemple.projet.persistence;

public class AccesDonneesOracleImpl implements AccesDonnees {
    @Override
    public void recupererUtilisateur() {
        System.out.println("Accès via Oracle");
    }
}

Ansuite, définissons la couche service avec une interface et une implémentation qui utilise l'injection par setter pour la dépendance DAO.

Interface de la couche service

package com.exemple.projet.service;

public interface ServiceUtilisateur {
    void obtenirUtilisateur();
}

Implémentation de la couche service

package com.exemple.projet.service;

import com.exemple.projet.persistence.AccesDonnees;

public class ServiceUtilisateurImpl implements ServiceUtilisateur {
    private AccesDonnees accesDonnees;

    public void setAccesDonnees(AccesDonnees acces) {
        this.accesDonnees = acces;
    }

    @Override
    public void obtenirUtilisateur() {
        accesDonnees.recupererUtilisateur();
    }
}

Test de l'implémentation

Un code de test démontre comment l'utilisateur peut basculer entre les implémentations DAO sans modifier le code du service.

package com.exemple.projet;

import com.exemple.projet.persistence.AccesDonneesMysqlImpl;
import com.exemple.projet.persistence.AccesDonneesOracleImpl;
import com.exemple.projet.service.ServiceUtilisateurImpl;

public class TestIoC {
    public static void main(String[] args) {
        AccesDonneesMysqlImpl mysql = new AccesDonneesMysqlImpl();
        ServiceUtilisateurImpl service = new ServiceUtilisateurImpl();
        service.setAccesDonnees(mysql);
        service.obtenirUtilisateur();

        AccesDonneesOracleImpl oracle = new AccesDonneesOracleImpl();
        service.setAccesDonnees(oracle);
        service.obtenirUtilisateur();
    }
}

Analyse du code

Si l'implémentation DAO était instanciée directement dans le service, changer la base de données nécessiterait des modifications dans le code source. Avec l'injection par setter, le contrôle est transféré à l'utilisateur, qui peut sélectionner dynamiquement l'implémentation souhaitée, améliorant ainsi l'extensibilité et la maintenabilité du code.

L'IoC repoce sur l'inversion du mécanisme d'obtention des objets dépendants. Dans des frameworks comme Spring, cela est réalisé via un conteneur IoC qui utilise l'injection de dépendances (DI) basée sur des descriptions comme les annotations ou le XML.

Étiquettes: IOC DI Java Spring Injection de dépendances

Publié le 22 juin à 01h43