Un principe fondamental souvent mal compris par les développeurs Java.
L'injection de dépendances en Spring Boot : pourquoi injecter l'interface plutôt que l'implémentation ?
Le concept
Au lieu d'instancier directement une classe concrète, on injecte une interface. Spring Boot se charge de fournir automatiquement l'implémentation correspondante.
Pourquoi cette approche ?
✅ Faible couplage : Le contrôleur ne connaît que l'interface, pas l'implémentation. Vous pouvez passer d'EmailNotificationService à SmsNotificationService sans toucher au contrôleur.
✅ Testabilité : Facile de créer des mocks pour les tests unitaires.
✅ Flexibilité : Possibilité d'avoir plusieurs implémentations et de choisir laquelle utiliser selon le contexte.
Spring Boot résout automatiquement quelle implémentation injecter grâce à son conteneur IoC. Si plusieurs implémentations existent, utilisez @Qualifier ou @Primary pour lever l'ambiguïté.
Ce principe respecte l'inversion de dépendance (SOLID) et rend votre code plus maintenable.
Pictet Technical Architect : Full Dev(Springboot/ Angular)Ops(Kubernetes/Docker/automation pipeline)
1 month ago
Pour un développeur expert Spring ceci ne sont pas les seuls vraies raisons. Et même quelque part dangereux de ne présenter que cela. Car c’est comme dire à chaque développeur que pour le respect de l’inversion de dépendance il faut faire du spring.
Sur le plan de spring tout ceci réside dans la façon dont Spring crée les proxy
- à partir de l’interface on utilise le JDK Dynamic Proxy on ne connaît pas l’implémentation réelle de la classe et la classe peut être une pure classe java et surtout si elle est annotée @Transactional alors la logique transactionnelle est effectuée AVANT d’exécuter la méthode.
- à partir d’une classe d’implémentation c’est le CGLIB Proxy qu’on utilise pour faire de l’injection surtout si elle n’implémente pas d’interface et cette classe ne doit pas être finale et ses méthodes ne doivent pas être finales et surtout on perd les avantages comme le Hot swapping de devtools mais pire encore tu perds la logique transactionnelle entre 2 méthodes de la même classe si une est annotée et l’autre pas.