Y a-t-il une façon au printemps que je peux renseigner automatiquement une liste avec tous les haricots d'un type et de ses sous-types? J'ai une méthode de setter qui ressemble à:
setMyProp(List<MyType> list)
5 Réponses :
Réponse courte: non. P>
Réponse longue: Les génériques Java fonctionnent par type Erasure, ce qui signifie qu'à l'exécution de ce paramètre est simplement une liste, pas une liste d'un type générique. En tant que tel, vous ne pouvez pas comprendre que cela est censé être de type de paramètre mytype, il ne serait donc pas possible de mettre en œuvre ce comportement. P>
Cela étant dit, il existe des moyens alternatifs de faire cela. Le plus évident semble être d'écouter la création de haricot, puis de voir s'ils sont de mytype (ou de sous-classes), puis de garder une référence. P>
Il y a probablement quelques façons de le faire. On est Création d'un post-processeur de haricot . De cette façon, vous serez notifié de chaque haricot créé. P>
Les informations de type pour les paramètres de la méthode ne sont pas complètement effacées et toujours disponibles pour le temps d'exécution. Vous pouvez y accéder via la méthode ou le constructeur getGenericParameTyTyTypes.
@MIK: Oui, mais il parlait d'un paramètre sur une fonction où aucune information de ce type n'est disponible.
S'il est acceptable de remplir la liste à partir de votre code d'application et non du fichier de définition de beans, vous pouvez utiliser le fichier org.springframework.beans.actory.xml.xmLBevenFactory code> et le demander "
getBeansoftype (mytype.class) code> ". Cela vous donne tous les haricots de type (et sous-type) de
mytype code>. P>
Cela fonctionne réellement pour toutes les classes mettant en œuvre ListAdBeAnfactory ( static.springsource.org/spring/docs/2.5.x/aPi/org/... )
Yup, vous pouvez le faire. Les documents de printemps disent:
Il est également possible de fournir tout haricots d'un type particulier de la ApplicationContext En ajoutant le annotation à un champ ou à une méthode qui attend un tableau de ce type. P> BlockQuote>
Notez qu'il vous est dit que vous devez vous attendre à une matrice, pas une liste. Cela a du sens, car l'effacement de type générique signifie qu'une liste peut ne pas fonctionner au moment de l'exécution. Cependant, prenez le test de l'unité suivant, qui fonctionne: p>
xxx pré> et cet appareil test: p>
xxx pré> si officiellement, vous 're supposé à AUTOWIRE
TYPEA [] CODE>, pas
Liste
code>, mais la liste fonctionne bien. P> P>
Si vous pouvez utiliser @autowired code> à l'intérieur du code à remplir, vous pouvez utiliser en toute sécurité la voie mentionnée par Skaffman. Si vous insistez sur la configuration XML, une petite bibliothèque a appelé HERA pour y parvenir. La configuration extentionnelle d'un scénario décrit par vous ressemble à ceci:
<bean id="client" class="..">
<property name="injectDynamicListHere">
<hera:list class="my.custom.SuperType" />
</property>
</bean>
cool merci. J'ai pu utiliser le @autowired dans le code, mais c'est bon à savoir.
Peut-être une chose mineure à ajouter est que la liste des herises respecte @Ordered annotations resp. Mise en œuvre de l'interface ordonnée pour permettre la détermination de l'ordre des haricots injectés.
En raison du code hérité et manquant @Autowired je le résout comme:
Comment voulez-vous que cette liste fonctionne avec des prototypes? Devrait-il contenir une seule instance, a ajouté chaque instance (fuite de mémoire) ou être de retour par une forme de liste de référence faible.
Tous les haricots seront des singletons dans mon cas