Liste de haricots de spring par type

Y at-il un moyen au spring que je puisse automatiquement remplir une liste avec tous les haricots d’un type ET de l’un de ses sous-types? J’ai une méthode de définition qui ressemble à:

setMyProp(List list) 

Et je voudrais autoriser automatiquement tous les haricots de MyType et toutes les sous-classes de MyType.

Merci Jeff

Oui, vous pouvez le faire. Les documents de spring disent:

Il est également possible de fournir tous les beans d’un type particulier à partir de ApplicationContext en ajoutant l’annotation à un champ ou à une méthode qui attend un tableau de ce type.

Notez qu’il indique que vous devez vous attendre à un tableau, 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 unitaire suivant, qui fonctionne:

       

et ce test unitaire:

 package test; @ContextConfiguration @RunWith(SpringJUnit4ClassRunner.class) public class Test { private @Autowired List beans; @org.junit.Test public void test() { assertNotNull(beans); assertEquals(2, beans.size()); for (TypeA bean : beans) { assertTrue(bean instanceof TypeA); } } public static interface TypeA {} public static class TypeB implements TypeA {} public static class TypeC extends TypeB {} public static class TypeD {} } 

Donc, officiellement, vous êtes censé autoriser TypeA[] , pas List , mais la liste fonctionne bien.

S’il est acceptable de remplir la liste à partir du code de votre application et non dans le fichier de définition de bean, vous pouvez utiliser le org.springframework.beans.factory.xml.XmlBeanFactory et lui demander ” getBeansOfType( MyType.class ) “. Cela vous donne tous les haricots de type (et sous-type) de MyType .

Si vous pouvez utiliser @Autowired dans le code à renseigner, vous pouvez utiliser en toute sécurité le chemin mentionné par skaffman. Si vous insistez sur la configuration XML, il existe une petite bibliothèque appelée Hera pour y parvenir. La configuration essentielle d’un scénario que vous décrivez ressemble à ceci:

      

Cela injectera tous les beans Spring de niveau supérieur implémentant SuperType tant que List dans le bean client.

Réponse courte: non.

Réponse longue: les génériques Java fonctionnent par type d’effacement, ce qui signifie qu’au moment de l’exécution, 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 qu’il s’agisse d’un paramètre de type MyType. Il n’est donc pas possible d’implémenter ce comportement.

Cela étant dit, il existe d’autres moyens de le faire. La plus évidente semble être d’écouter la création d’un bean, puis de voir s’il s’agit de MyType (ou de sous-classes) et de conserver une référence.

Il y a probablement plusieurs façons de le faire. On crée un post-processeur de haricot . De cette façon, vous serez averti de chaque bean créé.

En raison de l’ancien code et de l’absence de @Autowired, je le résout comme suit:

 MyBean implements ApplicationContextAware{ @Override public void setApplicationContext(ApplicationContext ctx) throws BeansException { final Map beansOfType = ctx.getBeansOfType(RequiredBean.class); ... }