0
votes

Pourquoi quand utiliser @Autowired in @Configuration au printemps a parfois échoué?

J'utilise la chaussure à ressort avec un serveur d'épargne et j'ai deux classes @Configuration avec deux méthodes de génération de haricots, et le code est comme suit: xxx

et un autre: < / p> xxx

mais lorsque j'exécute le démarrage à ressort: exécuter, il imprime null pour "System.Out.println (EagleProxy);" Pourquoi?

========================= Mise à jour ================ ===============

Je sais que l'injection d'injecteur ou l'injection de constructeur.


1 commentaires

Vous trouverez peut-être que cela fonctionne dans certaines constructions, puis non dans d'autres en raison de l'instanciation adressée de @bean méthodes dans @configuration classes. Utilisez la réponse fournie par @DKD pour que votre méthode @bean reçoit ses dépendances construites en tant que constructeur argument ou s'appuie sur des hacks tels que @lazy pour empêcher l'instanciation accessible.


5 Réponses :


1
votes

Vous voudrez peut-être essayer cela. XXX

Je suppose que la façon dont vous implémentez actuellement n'indique pas une dépendance entre le EagleService et EaglerestClient . Donc, votre mise en œuvre actuelle conduit à une commande d'initialisation aléatoire entre les deux haricots. La version modifiée raconte le printemps "hey, mon eagleservice dépend de eaglerestclient . Veuillez initialiser eaglerestclient avant eagleservice . .


2 commentaires

Merci. En fait, je sais que cela fonctionne, mais je veux savoir pourquoi mon code ne fonctionne pas :(


@Gao C'est quelque chose lié à la façon dont le printemps détermine les dépendances entre les haricots. Votre mise en œuvre actuelle n'implique pas que la dépendance existe.



-3
votes

Tout d'abord, vous devez obtenir le conteneur à ressort via ApplicationContexTAWARE CODE> ESSAYER

ApplicationContext.getBean(EagleRestClient.class)


3 commentaires

Vous ne devez pas utiliser le ApplicationContext ou BeansFactory dans votre code directement, ce qui indique généralement que vous faites des choses de mauvaise manière.


Pourquoi? Y a-t-il un bug?


Vous devez utiliser une injection de dépendance plus le fait que vous ne souhaitez pas nouer votre code d'application à l'aide de l'application ApplicationContext pour faire une recherche de haricot.



2
votes

Parce que la commande de chargement eaglebeancreator et eagleservicebuilder n'est pas défini. Vous pouvez utiliser @Ordon ou @conitivealonclass pour vous assurer que EagleBeancreator initialise d'abord.


0 commentaires

0
votes

Parce que le haricot @configuration est initialisé dans la même phase de cycle de vie des haricots. Je ne me souviens pas d'eux clairement, mais quelque chose comme:

configurations -> composants -> services

Avec les haricots dans la même phase, si elles dépendent l'une de l'autre, vous devriez déclarer l'ordre de charge par certains @conitionnal ou @order


0 commentaires

0
votes

Ajouter @dependson ("EaglerestClient") Annotation sur la définition de Eagleservice.

@DependsOn("eagleRestClient")
@Bean
 public EagleService eagleService() {
       EagleService service = new 
       EagleService();
       System.out.println(eagleProxy);
       service.setEagleProxy(eagleProxy);
        return service;
  }


0 commentaires