Printemps autowire et le prototype de la portée
J'ai une classe nommée Bar avec l'annotation suivante:
@Configurable(autowire = Autowire.BY_TYPE)
Sur un membre privé j'ai l'annotation suivante:
@Autowired(required = true)
private Foo foo;
Dans la configuration spring, j'ai un haricot de la classe Foo. Si le bean est défini avec scope="prototype"
il ne fonctionne pas et j'obtiens l'exception suivante:
NoSuchBeanDefinitionException: Pas de correspondance bean de type Foo trouvé pour la dépendance:
attendre au moins 1 fève qui se qualifie comme autowire candidat pour cette dépendance
Une fois que j'ai changer le bean injecté portée à "singleton"
il fonctionne très bien.
N'est pas auto câblage de prototypes de l'étendue de haricots permis?
Est-il une solution de contournement (à côté de l'obtention de la fève manuellement)?
Merci d'avance,
Avner
OriginalL'auteur Avner Levy | 2012-03-22
Vous devez vous connecter pour publier un commentaire.
Les liens suivants fournissent des solutions de rechange pour ce type de scénarios:
Le premier lien parle de l'ajout de Toto:
Qui sera la cause d'une nouvelle instance à chaque appel.
Seul lien réponses sont mauvaises, ce qui va se passe si les liens disparaissent?
OriginalL'auteur Avner Levy
Je crois que c'est le prototype/singleton chose déclarée dans votre xml pour que le haricot est la question.
Je pense qu'il n'est pas permis. La logique est que si elle est autorisée, alors à chaque fois que vous utilisez cette classe, il faut retrouver cet haricot toujours comme son domaine. Ce qui est bizarre, surtout si la classe que ce bean est autocâblés comme un champ est un singleton.
Juste essayer de retirer l'attribut scope, cause, si c'est de prototype de l'attribut, il ne sera pas récupéré. Si les fèves(services et DAO) sont déclarés dans votre applicationContext, il suffit de laisser le autowire annotation de l'obtenir en tant que singleton car par défaut, les haricots sont singleton, qui doit l'être.
je ne sais pas si il y a une alternative pour votre conception spécifique, dites-moi si il y est. Mais aussi loin que la conception est concerné, les haricots doivent être utilisés dans un apatride façon, cela signifie être prudent dans vos champs, assurez-vous que les champs d'utilisation de ces grains ne sont pas des champs globaux, mais des champs de la méthode, de cette manière, même sa est un singleton, vous ne vous inquiétez pas si elle est partagée par un grand nombre de classes depuis pas de variable globale est partagée,parce qu'elle est Apatride.
OriginalL'auteur vine
Si le bean injecté portée est "Singleton", la même instance du bean sera auto-câblé. Si le bean injecté portée est de "prototype", la nouvelle instance sera créée dans le cadre de l'auto-fil du processus.
Quelle version de Printemps que vous utilisez et aussi attacher de l'spring-context.xml pour plus de détails.
OriginalL'auteur user1268571