9 votes

Comprendre l'ordre d'initialisation du contexte Spring

J'ai un ensemble complexe d'objets et de dépendances entre eux. Tous les beans sont @Service , @Repository o @Controller annoté et j'utilise le @PostConstruct annotation. Il y a quelques dépendances circulaires mais le système a quand même été correctement initialisé par Spring.

Puis j'ai ajouté un simple contrôleur avec juste une dépendance à l'un des services. Théoriquement, le système devrait être capable de démarrer car il pourrait d'abord configurer le système comme avant et ensuite le nouveau contrôleur. Mais Spring se plaint qu'il ne peut pas configurer le contexte :

Error creating bean with name 'userService': Requested bean is currently in creation: Is there an unresolvable circular reference?

Puis-je en quelque sorte aider Spring à ordonner l'initialisation du contexte ? Je pense que le problème principal est le userService qui est beaucoup utilisé par le système à des fins d'authentification.

10voto

Stijn Geukens Points 5482

La meilleure solution serait simplement de supprimer la dépendance circulaire ; je n'ai pas encore rencontré de scénario où une telle structure était justifiée. Mais si vous voulez la conserver, peut-être que votre problème est dû au fait que vous avez une injection de constructeur quelque part :

Dépendances circulaires Si vous utilisez l'injection prédominante de constructeurs, il est possible d'écrire et de configurer vos classes et vos beans de telle sorte qu'un scénario de dépendance circulaire insoluble soit créé. Considérez le scénario où vous avez la classe A, qui requiert une instance de la classe B à fournir via l'injection de constructeur, et la classe B, qui requiert une instance de la classe A à fournir via l'injection de constructeur. Si vous configurez les beans des classes A et B pour qu'ils soient injectés l'un dans l'autre, le conteneur IoC de Spring détectera cette référence circulaire au moment de l'exécution et lancera une exception BeanCurrentlyInCreationException.

Une solution possible à ce problème est d'éditer le code source de certaines de vos vos classes pour qu'elles soient configurées via plutôt que par des constructeurs. Une autre solution consiste à ne pas utiliser et de s'en tenir à l'injection de setter uniquement. En d'autres termes, alors qu'il devrait généralement être évité, sauf dans les cas les plus rares. circonstances il est possible de configurer des dépendances circulaires avec injection de setter. Contrairement au cas typique (sans dépendances circulaires), une dépendance circulaire entre le bean A et le bean B va forcer l'un des beans à être injecté dans l'autre avant que avant d'être lui-même complètement initialisé (une scénario classique de la poule et de l'œuf).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X