7
votes

Comment écraser les haricots de service à ressort par nom, à l'aide d'annotations uniquement

étant donné que j'ai un haricot de printemps configuré comme xxx

et une classe à l'aide de ce haricot xxx

Je veux maintenant mon projet, que Comprend les classes précédentes, d'avoir consommateur une autre implémentation de myservice étant injectée. Par conséquent, je voudrais écraser le haricot myservice xxx

résultant consommateur portant désormais une instance de spécialisé au lieu de defaultservice . 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 .


0 commentaires

4 Réponses :


3
votes

Définir explicitement le haricot de service explicitement xxx

ou numérisation du composant.

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.


1 commentaires

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.



2
votes

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>


1 commentaires

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!



0
votes

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" />


0 commentaires

-3
votes

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> xxx pré>

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> xxx pré>

pour obtenir une implémentation spécialisée p>

@Autowired
@Qualifier("mySpecializedService")
MyService myService;


2 commentaires

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.