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.