nous utilisons Spring dans notre projet et aujourd'hui j'ai trouvé, à mes yeux, un étrange beaviour. À mon avis, l'injection de dépendances et l'annotation @DependsOn devraient être les mêmes dans les deux cas suivants
@Bean public ClassA classA(){ //code } @Bean @DependsOn("classA") public ClassB classB(){ someMethodWhichNeedsClassA() }
et
@Bean public ClassA classA(){ //code } @Bean public ClassB classB(ClassA classA){ someMethodWhichNeedsClassA() }
Il semble que ces deux manières ne sont pas identiques. Je ne suis pas autorisé à partager mon code, mais dans le premier cas j'ai accès à une liste qui est remplie dans le premier Bean, mais pas dans le second cas. J'ai essayé de trouver quelque chose dans la documentation ou dans d'autres blogs mais sans succès.
Quelqu'un a-t-il une idée s'il y a des différences entre ces deux manières, parce que je pense que cela a quelque chose à voir avec l'ordre de la création de haricots et c'est tout.
Merci pour toute aide
3 Réponses :
Spring, par défaut, gère le cycle de vie des beans et organise leur ordre d'initialisation. C'est le cas dans votre premier exemple. Alors que dans votre deuxième exemple, vous dites à Spring que le haricot B dépend de A. Le printemps créera donc le haricot A avant le haricot B.
@ Dépend de la documentation du printemps:
Beans dont dépend le bean actuel. Tous les beans spécifiés sont garantie d'être créée par le conteneur avant ce bean. Utilisé rarement dans les cas où un bean ne dépend pas explicitement de un autre via des propriétés ou des arguments de constructeur, mais plutôt dépend des effets secondaires de l'initialisation d'un autre bean.
salut, merci pour votre réponse. Dans le premier cas, le bean ClassA doit être créé avant ClassB car il est utilisé dans le constructeur et Spring doit le créer à cause de l'injection de dépendances
Veuillez poster tout le code pertinent. Je ne vois pas le constructeur où vous utilisez l'une de ces classes
Je ne suis pas autorisé à partager le code, mais la classe ne dépend pas directement de la classe, mais elle appelle une méthode qui nécessite la classeA
Si le bean B appelle une méthode sur le bean A (ou passe à d'autres objets / méthodes qui appellent éventuellement des méthodes du bean A), alors l'injection de dépendances est suffisante.
Bug il y a des cas où le bean B n'a pas besoin d'appeler de méthode sur le bean A, mais dépend du résultat de l'initialisation du bean A. Supposons que le bean A lors de son initialisation crée des tables dans la base de données, et le bean B a besoin de ces tableaux avant de pouvoir être utilisé. Alors l'injection de dépendances n'a aucun sens. Tout contrôle de qualité du code vous montrera que la variable injectée n'est pas utilisée et n'est donc pas nécessaire. Dans ce cas, vous n'injectez pas le bean A dans B, mais déclarez une dépendance sur le bean A.
En bref: si le bean B appelle le bean A, utilisez l'injection de dépendances. Si le bean B n'a besoin que des résultats de l'initialisation du bean A, utilisez @DependsOn .
En termes simples, il y a deux scénarios
@DependsOn
pour nous assurer que les beans dépendants sont initialisés avant d'être utilisés.
Qu'entendez-vous par besoins dans la méthode someMethodWhichNeedsClassA () ? Voulez-vous dire que cette méthode appelle classA ? Ou voulez-vous dire qu'il n'a besoin que des résultats de l'initialisation du bean classA ?