2010-04-12 4 views
0

Santa a une liste. Il veut faire un "cadeau" pour chaque enfant sur la liste d'hist (nous supposons pour le moment qu'ils sont tous bons) et les charge tous dans son traîneau. Peut-il le faire avec Spring?Spring FactoryBean - itérer sur une liste de "création d'objet"

J'ai écrit une FileListFactory simple qui implémente FactoryBean et retourne une liste de chaînes représentant les lignes d'un fichier donné. Mettez cela de côté pour l'instant - si nous résolvons le problème pour une liste <>, alors je suppose que je peux brancher une référence à la sortie de cette usine à sa place.

Ce que je veux est une liste d'objets "foo". Les objets foo sont des instances non-singleton de certains beans (probablement avec une définition de bean abstraite). Chaque objet foo créé obtient l'un des éléments de liste en tant que propriété. Pour remonter le niveau un an plus loin, la propriété en question est un objet "barre". J'ai déjà créé un éditeur de propriétés pour créer des objets "barre" à partir de chaînes. Ainsi, la chose qui itère sur la liste des chaînes doit utiliser l'infrastructure de l'éditeur de propriétés lors de la définition de la propriété par instance.

Il semble qu'il devrait y avoir une sorte de bean iterator de liste d'usine ou quelque chose pour cela. Le problème semble être que toutes les recherches que je fais pour trouver des exemples de solutions à cet échec échouent parce que les termes comme "liste" sont beaucoup trop génériques.

Répondre

0

Je ne suis jamais revenu pour documenter ce que j'ai fini.

La magie est que l'objet d'usine qui itère sur la liste est abstract. Il a une méthode abstraite qui renvoie des instances de "foo". Dans ce cas:

public abstract Foo createFoo(); 

Bien que ce soit une classe abstraite, vous créez une instance concrète de celui-ci dans la configuration XML Spring, mais avec un nœud enfant supplémentaire dans le fichier XML qui ressemble à ceci:

<bean id="Santa" class="..."> 
    <lookup-method name="createFoo" bean="fooFactory"/> 
    ... 
</bean> 

Et le bean "fooFactory" est une usine qui vend des objets Foo. Le résultat net est que, grâce à la magie de Spring IoC, vous obtenez un objet anonyme qui est une instanciation concrète de la classe abstraite qui inclut une implémentation de la méthode abstraite qui référence le bean factory.

Le code de classe Santa prend simplement la liste, itère dessus, appelle createFoo() pour obtenir un Foo, puis appelle Foo.setBar() selon le cas.

Mischief réussi!

0

Si je vous ai bien compris, vous avez une liste de chaînes (lue dans un fichier, par exemple). Pour chacune de ces chaînes, vous voulez créer un objet "foo" où la chaîne donnée est assignée à la propriété "bar", avec la conversion appropriée.

Vous pouvez y parvenir en implémentant un BeanFactoryPostProcessor. Pour chacune des chaînes, créez un nouveau BeanDefinition et enregistrez-le auprès de la fabrique cible. Pour simplifier les choses, créez et enregistrez un ChildBeanDefinition, en fournissant le nom du bean "parent" avec toute la configuration générique et en ne définissant que la propriété "bar".

+0

Vous avez la déclaration de corriger le problème, mais « Pour chacune des chaînes, créez une nouvelle BeanDefinition » Comment faites-vous cela? – nsayer

+0

new ChildBeanDefinition ("myAbstractParentBean") Voir BeanDefinition, BeanDefinitionRegistry et implémentations. – lexicore

+0

oh, je vois. Le BFPP prend la liste comme une propriété et le fait dans le code. J'ai fini par faire quelque chose de similaire pour résoudre ça, mais avec des haricots ordinaires. J'ai un objet de liste de barres branché dans un "FooListCreator" spécial. Ce gadget est BeanFactoryAware et demande une instance de "foo" pour chaque "barre" dans la liste, puis définit par programme la propriété de la barre. J'espérais juste que plus de ceci était faisable sans code Java réel - c'est-à-dire, dans le contexte de l'application, les fichiers xml eux-mêmes. – nsayer

Questions connexes