étant donné que j'ai un haricot de printemps configuré comme et une classe à l'aide de ce haricot p> Je veux maintenant mon projet, que Comprend les classes précédentes, d'avoir résultant consommateur code> une autre implémentation de
myservice code> étant injectée. Par conséquent, je voudrais écraser le haricot
myservice code> p>
consommateur code> portant désormais une instance de
spécialisé code> au lieu de
defaultservice code>. Par définition, je ne peux pas avoir deux haricots avec le même nom dans le conteneur à ressort. Comment puis-je dire au printemps que la définition du nouveau service écrasera l'ancien? Je ne veux pas modifier la classe
consommateur code>. P> p>
4 Réponses :
Définir explicitement le haricot de service explicitement ou numérisation du composant. p> dans l'un ou l'autre cas, dans votre contexte d'application, évitez de définir explicitement la définition de la valeur par défaut et d'éviter les composants le balayant. p> p>
Merci, Willie. Nous avons fini par votre solution depuis que nous avons également décidé de raisons pour des raisons de maintenance (nous parlons de centaines de services) pour conserver la liste de chaque service d'un fichier - à savoir la configuration de Spring Bean. Définir juste une pièce d'identité et le nom de classe n'est pas trop douloureux que d'utiliser des annotations uniquement est plus tentant.
excluez-le de la numérisation du composant à l'aide d'un filtre
<component-scan base-package="your-package"> <exclude-filter type="regex" expression="DefaultService" /> </component-scan>
Merci, Wilhelm, je suis sûr que votre solution fonctionnerait. Mais je devrais ensuite numériser mes services par moi-même. Bonne idée!
Le câblage à base d'annotation se produit avant la configuration XML, qui signifie des haricots définis dans XML écrasez-vous ces câbles effectués par annotations. Alors, définissez-le explicitement dans XML, comme Willie a dit que le travail
<bean id="myService" class="x.y.z.SpecializedService" />
Je sais, c'est en retard. Toujours l'afficher.
Vous devez avoir des noms différents pour différentes implémentations de myservice. P>
par exemple p> tout en les modifiant (disons dans le contrôleur) , vous pouvez utiliser @qualifier pour injecter la mise en œuvre souhaitée comme mentionné ci-dessous. p> pour obtenir la mise en œuvre par défaut p> pour obtenir une implémentation spécialisée p> @Autowired
@Qualifier("mySpecializedService")
MyService myService;
Ceci est complètement opposé à ce que OP a demandé.
J'aurais défini de nouveaux haricots sur l'autre dans un fichier de configuration séparé (XML ou Java) et le laisser passer à la précédente, ou aurait été avancé avec des profils de printemps ou @Conditional.