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: et un autre: < / p> mais lorsque j'exécute le démarrage à ressort: exécuter, il imprime null pour "System.Out.println (EagleProxy);"
Pourquoi? P> ========================= Mise à jour ================ =============== P> Je sais que l'injection d'injecteur ou l'injection de constructeur. p> p>
5 Réponses :
Vous voudrez peut-être essayer cela. Je suppose que la façon dont vous implémentez actuellement n'indique pas une dépendance entre le EagleService code> et EaglerestClient Code>. 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 code>. Veuillez initialiser eaglerestclient code> avant eagleservice code>. P> P>.
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.
Tout d'abord, vous devez obtenir le conteneur à ressort via ApplicationContexTAWARE CODE> ESSAYER ApplicationContext.getBean(EagleRestClient.class)
Vous ne devez pas utiliser le ApplicationContext Code> ou BeansFactory code> 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 Code> pour faire une recherche de haricot.
Parce que la commande de chargement eaglebeancreator code> et eagleservicebuilder code> n'est pas défini. Vous pouvez utiliser @Ordon code> ou @conitivealonclass code> pour vous assurer que EagleBeancreator code> initialise d'abord. P>
Parce que le haricot code> @configuration code> 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: p>
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 configurations -> composants -> services code> p>
@conitionnal code> ou @order code> p>
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;
}
Vous trouverez peut-être que cela fonctionne dans certaines constructions, puis non dans d'autres en raison de l'instanciation adressée de
@bean code> méthodes dans@configuration code> 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 code> pour empêcher l'instanciation accessible.