2017-09-28 13 views
-1

J'ai rencontré ce problème lorsque j'essaie de remplacer le bean RibbonRoutingFilter défini dans spring zuul. Pour emphase, je fais un override, pas seulement en créant un bean du même type. Donc, en fin de journée, je veux que le "haricot ribbonRoutingFilter" de zuul ne soit pas enregistré du tout.Comment remplacer les haricots de printemps avec Java config

J'ai donc ma propre implémentation. La première chose que j'ai essayée, j'ai utilisé l'annotation @component et autowire les dépendances. Ajout d'un point d'arrêt dans le constructeur, et il n'a jamais été appelé. Donc je réalise que ma définition doit être chargée plus tôt que celle de zuul. J'ai donc créé une classe de configuration avec l'annotation @Configuration et @Order(Ordered.HIGHEST_PRECEDENCE), et j'utilise une annotation @Bean pour instancier ma classe là-bas. Cependant, ma méthode est toujours chargée plus tôt.

Répondre

0

Il s'est avéré qu'il existe un certain ordre que Spring suit lors du chargement des définitions de classes de configuration et où les remplacements ont lieu. La classe org.springframework.context.annotation.ConfigurationClassParser a la logique détaillée dans la méthode doProcessConfigurationClass(). Je vais mettre mon résumé simplifié ou la règle de commande ici:

  1. si vous classe d'application (où la méthode est définie principale()) a des classes définies dans, ils sont analysés et la définition à l'intérieur entre eux sont enregistrés d'abord
  2. alors il haricots enregistrés définis comme @component et définis dans la classe @Configuration
  3. il ajoutera des définitions introduites par @import
  4. il ajoutera des définitions introduites par @ImportResource
  5. puis ajouter des définitions de @bean méthodes à l'intérieur de l'application cl puis
  6. puis à partir des méthodes par défaut sur les interfaces (je pense que c'est java 8)
  7. puis essayez de faire les mêmes étapes ci-dessus pour toutes les classes parentes que votre classe d'application a étendues.

Cela explique pourquoi mon remplacement ne fonctionnait pas. C'est parce que tout ce que j'ai essayé est à l'étape 2. Mais zuul a défini le bean par un @Import qui est l'étape 3.

Donc pour résoudre mon problème, j'ai ajouté une méthode annotée @Bean à ma classe d'application. l'instanciation et le remplacement se sont simplement déroulés comme prévu.

Le résumé ci-dessus peut ne pas être précis, il vous donne juste une idée de ce qui aurait pu échouer votre remplacement. Vous feriez mieux de déboguer ConfigurationClassParser lorsque vous essayez votre cas d'utilisation spécifique.

+0

Veuillez suivre le format Q & A de Stack Overflow lorsque vous répondez à vos questions. Ce n'est pas une réponse. –

+0

J'ai déplacé la réponse à la bonne case. – FTP