Une dépendance cyclique intervient en Java lorsque deux class ou deux modules dépendent l'un de l'autre, formant ainsi un cycle.
Supposons que nous ayons deux beans A et B qui dépendent l'un de l'autre comme le montre l'exemple ci-dessous :
@Component
public class A{
private final B b;
public A(B b){
this.b = b;
}
}
@Component
public class B{
private final A a;
public B(A a){
this.a = a;
}
}
Lors de l'exécution de votre projet, vous aurez l'erreur suivante :
Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.
Ainsi, pour résoudre cette dépendance cyclique, nous avons quatre solutions :
- Refactoriser le code pour séparer les responsabilités.
- Utiliser des classes intermédiaires ou des interfaces.
- Appliquer l'injection de dépendances via des méthodes (setter).
- Utiliser des annotations comme @lazy pour retarder l'initialisation.
Dans notre cas, nous utiliserons la quatrième solution qui est juste d'utiliser l'annotation @lazy comme le montre l'exemple ci-dessous :
@Component
public class A{
private final B b;
public A(@Lazy B b){
this.b = b;
}
}
@Component
public class B{
private final A a;
public B(A a){
this.a = a;
}
}
Et voilà, nous sommes désormais sorti de ce cycle :)
Top comments (0)