Bonjour ! Dans la leçon précédente, nous avons découvert le "pourquoi" de Spring : il résout les problèmes de couplage fort et de gestion manuelle des dépendances qui rendent les applications complexes et rigides. Nous avons introduit l'Inversion de Contrôle (IoC) comme le principe directeur où un framework prend les rênes de l'application.
Aujourd'hui, nous passons du "pourquoi" au "comment". Cette leçon est consacrée à la définition précise des concepts d'Inversion de Contrôle (IoC) et de son mécanisme de mise en œuvre : l'Injection de Dépendances (DI). Vous comprendrez non seulement ce que signifient ces termes, mais aussi comment Spring les utilise pour construire des applications souples et maintenables.
À la fin de cette leçon, vous serez capable de :
- Définir précisément l'Inversion de Contrôle et le rôle du conteneur IoC.
- Expliquer ce qu'est l'Injection de Dépendances et en quoi elle est l'implémentation de l'IoC.
- Distinguer les différentes stratégies d'injection (par constructeur, par setter) et comprendre leurs cas d'usage.
1. Qu'est-ce que l'Inversion de Contrôle (IoC) ?
Dans la leçon précédente, nous avons vu l'IoC comme une solution. Formalisons maintenant sa définition. L'IoC est un principe d'architecture où le flux de contrôle d'un programme est inversé par rapport aux méthodes de programmation traditionnelles.
- Approche traditionnelle (Bibliothèque) : Votre code est le chef. Il décide quand et comment appeler les fonctions d'une bibliothèque externe.
- Approche IoC (Framework) : Le framework est le chef. Il constitue l'ossature de l'application et décide quand appeler votre code.

L'entité qui met en œuvre ce principe est appelée le conteneur IoC. Spring est avant tout un conteneur IoC. Sa mission principale est de gérer le cycle de vie des objets de votre application (appelés beans dans le jargon Spring) et de s'assurer que leurs dépendances sont correctement satisfaites.
L'article suivant de Gayerie.dev offre une excellente synthèse de ces notions.
L'inversion de contrôle — Spring Framework / Spring Boot
Cet extrait définit de manière formelle le principe d'IoC en le distinguant d'une simple bibliothèque, puis il introduit le rôle central du conteneur IoC.
Lisez les sections intitulées "L’inversion de contrôle" et "Notion de conteneur IoC". Concentrez-vous sur la distinction entre framework et bibliothèque, et sur le rôle attribué au conteneur : créer les objets et gérer leurs dépendances.
2. L'Injection de Dépendances (DI) : Le "Comment" de l'IoC
Maintenant que nous savons que le conteneur IoC gère les dépendances, la question est : comment le fait-il concrètement ? La réponse est : par l'Injection de Dépendances (Dependency Injection - DI).
Il est crucial de bien distinguer les deux :
- IoC est le principe (le but) : inverser le contrôle pour que le framework gère l'application.
- DI est le pattern de conception (le moyen) : fournir à un objet ses dépendances de l'extérieur, au lieu qu'il les crée lui-même.
En d'autres termes, l'Injection de Dépendances est la mise en œuvre pratique de l'Inversion de Contrôle.
Le diagramme ci-dessous résume parfaitement cette relation.
JEE Servlet,jsp,beans,spring MVC,Spring Boot - FixWins.com
Cet extrait, et surtout son diagramme, clarifie la relation entre l'IoC en tant que concept global et la DI en tant qu'implémentation.
Analysez le diagramme et lisez le court texte sous celui-ci pour bien ancrer la distinction entre ces deux termes fondamentaux.
L'idée de la DI est simple : une classe ne doit plus instancier ses propres dépendances avec new. Elle doit simplement les déclarer (idéalement via des interfaces) et faire confiance à une entité externe (le conteneur IoC) pour les lui "injecter".

3. De la théorie à la pratique : Mise en œuvre de la DI
Pour vraiment comprendre l'injection de dépendances, rien ne vaut une démonstration complète. La vidéo suivante est exceptionnelle car elle construit le concept pas à pas, en partant du problème que nous connaissons déjà pour arriver à la solution élégante qu'offre un framework.
Part 1- DI and IOC- Ce qu'il fait savoir et savoir faire avant de commencer Spring Boot
Dans cette vidéo, le professeur Mohamed Youssfi part d'un code à couplage fort et le refactorise progressivement pour introduire le couplage faible et l'injection de dépendances manuelle. C'est le cheminement intellectuel exact qu'ont suivi les créateurs de Spring.
Regardez attentivement les deux parties suivantes : Dépendre des interfaces : L'instructeur met en place l'architecture que nous connaissons bien, avec une couche métier (MetierImpl) qui dépend d'une interface d'accès aux données (IDao). Cela illustre parfaitement le couplage faible. Le besoin d'injecter : C'est le cœur de la leçon. Vous verrez pourquoi le code lève une NullPointerException si la dépendance n'est pas fournie. L'instructeur montre ensuite comment "résoudre" ce problème en utilisant une méthode setDao(). C'est votre première rencontre avec l'injection par setter. L'explication avec les schémas sur ce qui se passe en mémoire est particulièrement éclairante.
Ce que vous venez de voir est l'injection de dépendances "manuelle". On a bien un moyen d'injecter la dépendance, mais c'est encore à nous, développeur, d'appeler la méthode setDao. L'étape suivante, que les frameworks automatisent, consiste à faire cela de manière dynamique. La vidéo continue en montrant comment faire cela via la "réflexion" Java, ce qui nous rapproche du fonctionnement interne de Spring.
4. L'automatisation par Spring
Le travail manuel ou via la réflexion, comme montré dans la vidéo, est fastidieux et source d'erreurs. C'est là que Spring apporte toute sa valeur. Il automatise entièrement ce processus.
La deuxième partie de la vidéo montre comment Spring prend le relais.
Part 2- DI and IOC- Ce qu'il fait savoir et savoir faire avant de commencer Spring Boot
Cette vidéo est la suite directe de la précédente. Elle montre comment Spring automatise tout ce qui a été construit manuellement.
Concentrez-vous sur ces passages : Injection via XML : C'est la manière "historique" de faire. On déclare nos objets (beans) et leurs relations dans un fichier de configuration XML. Cela vous montre comment on dit à Spring "crée cet objet et injecte-lui celui-ci". Injection via annotations : C'est l'approche moderne. Avec des annotations comme @Component (pour dire à Spring "gère cet objet") et @Autowired (pour dire "injecte une dépendance ici"), le code devient beaucoup plus concis. Bonne pratique : l'injection par constructeur : L'instructeur explique pourquoi l'injection directement dans un attribut (@Autowired sur un champ) est une mauvaise pratique et comment l'injection par constructeur est la méthode recommandée. C'est une notion essentielle pour écrire du code Spring professionnel.
Cette vidéo vous a montré les trois principales stratégies de DI :
- Injection par constructeur (recommandée) : Les dépendances sont des paramètres du constructeur. Cela garantit qu'un objet est toujours créé dans un état valide (avec toutes ses dépendances obligatoires) et favorise l'immuabilité (les champs peuvent être
final). - Injection par setter : Les dépendances sont injectées via des méthodes
set...(). Utile pour les dépendances optionnelles, car l'objet peut être créé sans elles. - Injection par champ (
@Autowiredsur l'attribut) : Le framework injecte la dépendance directement dans le champ, même s'il est privé. C'est simple à écrire, mais fortement déconseillé car cela rend le code plus difficile à tester et cela brise l'encapsulation.
Conclusion
Reprenons les idées clés de cette leçon :
- L'Inversion de Contrôle (IoC) est un principe de conception où le framework (et non votre code) gère le flux principal de l'application. Spring est un conteneur IoC.
- L'Injection de Dépendances (DI) est le pattern qui met en œuvre l'IoC. C'est le processus par lequel le conteneur fournit à un objet les dépendances dont il a besoin.
- Le but de ce duo IoC/DI est de créer un couplage faible entre les composants, rendant l'application modulaire, facile à maintenir et à tester.
- La méthode d'injection la plus robuste et recommandée est l'injection par constructeur.
Vous avez maintenant une compréhension solide des concepts fondateurs de Spring. Vous savez non seulement ce que signifient IoC et DI, mais aussi pourquoi ils sont si importants et comment ils fonctionnent en pratique.
Dans la prochaine leçon, nous allons enfin mettre les mains dans le cambouis ! Nous utiliserons Spring Initializr pour créer notre tout premier projet Spring Boot, définirons nos premiers beans avec @Service, et réaliserons notre première injection de dépendances par constructeur pour créer un endpoint REST simple. La théorie va devenir très concrète.