Instanciation de plusieurs grains de la même classe avec le Printemps, les annotations
Avec un XML configuré Printemps bean factory, je peux facilement instancier plusieurs instances de la même classe avec des paramètres différents. Comment puis-je faire la même chose avec des annotations? Je voudrais quelque chose comme ceci:
@Component(firstName="joe", lastName="smith")
@Component(firstName="mary", lastName="Williams")
public class Person { /* blah blah */ }
- Je ne pense pas que vous le pouvez.
@Component
est un léger commodité, mais pas de substitut pour la configuration XML. - Je pense qu'il est regrettable que XML est considéré comme la bonne façon de configurer une application.
- Tout simplement parce que
@Component
ne peut pas le faire ne signifie pas que XML est la solution. Je ne sais pas à propos de 2011, mais vous pouvez obtenir le même effet dans une java@Configuration
très bien maintenant. - Vous pouvez poster une réponse? Si vous voulez dire exactement ce que Espen dit dans sa réponse, il n'est pas vraiment une réponse à cette question particulière. C'est seulement à proximité..
- c'est exactement ce que je voulais dire. Comment est-il pas une réponse à cette question? XML n'est plus la bonne façon de configurer une application.
Vous devez vous connecter pour publier un commentaire.
Oui, vous pouvez le faire avec une aide personnalisée BeanFactoryPostProcessor mise en œuvre.
Voici un exemple simple.
Supposons que nous avons deux composants. L'une est la dépendance de l'autre.
Première composante:
Comme vous avez pu le voir, il n'y a rien de spécial au sujet de ce composant. Il a une dépendance sur deux instances différentes de MySecondComponent.
Deuxième composante:
C'est un peu plus délicat. Voici deux choses à expliquer. Premier - @Qualifier - annotation qui contient des noms de MySecondComponent haricots. C'est un standard, mais vous êtes libre de mettre en place votre propre. Vous verrez un peu plus tard pourquoi.
Deuxième chose à mentionner est l'interface factorybean mise en œuvre. Si bean implémente cette interface, il est prévu de créer d'autres instances. Dans notre cas, il crée des instances avec MySecondComponent type.
La partie la plus délicate est BeanFactoryPostProcessor mise en œuvre:
Que fait-il? Il passe par tous les haricots annotée avec @Qualifier, extrait des noms à partir de l'annotation, puis crée manuellement les haricots de ce type avec des noms spécifiés.
Voici un Printemps config:
Dernière chose à noter ici est bien que vous peut ce faire, il vous ne devrait pas sauf si c'est un must, car ce n'est pas vraiment le moyen le plus naturel de configuration. Si vous avez plus d'une instance de la classe, il est préférable de coller avec XML de configuration.
isSingleton
retourfalse
?BeanFactoryPostProcessor
s'exécute avant toutBeanPostProcessor
s ont été créés. La documentation dit aussi de ne pas instancier tous les haricots (par exemplegetBeansWithAnnotation
) au cours depostProcessBeanFactory
.Il n'est pas possible. Vous en obtenir un duplicata d'exception.
Il est également loin d'être optimale avec les données de configuration de ce genre dans vos classes d'implémentation.
Si vous souhaitez utiliser les annotations, vous pouvez configurer votre classe avec Java config:
J'ai juste eu à résoudre un cas similaire. Cela peut fonctionner si vous pouvez redéfinir la classe.
Alors utilisez simplement PersonOne ou PersonTwo chaque fois que vous devez autowire une instance spécifique, partout ailleurs suffit d'utiliser la Personne.
Inspiré par la cire de réponse, la mise en œuvre peut être plus sûr et de ne pas ignorer les autres post-traitement si les définitions sont ajoutées, à construire des singletons:
Le haricot noms pourraient encore venir de n'importe où, comme de la cire de
@Qualifier
exemple. Il existe diverses autres propriétés du bean définition, y compris la possibilité d'hériter de l'usine elle-même.BeanFactoryPostProcessor
types en générant des haricots en grains de l'usine de post-processeur de phase. Bien que les haricots générés ici seulement ont l'intention de changer de haricot définitions (qui, sur son propre, doit être en sécurité au cours de cette phase), il est important de savoir que tous les autres haricots requis par la@Configuration
classe peut également être instancié. Cela peut conduire à des problèmes depuis le cycle de vie des contraintes sont violées. Tant que c'est bien documenté, compris, et les modifications sont examinées avec soin, c'est une bonne solution.Si vous avez besoin d'injecter, dans le nouvel objet créé, des haricots ou des propriétés à partir du printemps, vous pouvez jeter un oeil à la section suivante de code dans lequel j'ai étendu la Espen répondre par l'injection d'un bean qui est créé à partir du printemps contexte:
Jetez un oeil à cette l'article pour tous les scénarios possible.