Question

Est-il possible au printemps que je peux remplir automatiquement une liste avec tous les haricots d'un type et l'un de ses sous-types? J'ai une méthode setter qui ressemble à:

setMyProp(List<MyType> list)

Et je voudrais dans les haricots lier automatiquement de MyType et toutes les sous-classes de MyType.

Merci, Jeff

Était-ce utile?

La solution

Eh oui, vous pouvez le faire. Le printemps docs disent:

  

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

Notez qu'il dit que vous devez attendre un tableau, pas une liste. Cela est logique, car l'effacement de type générique, une liste peut ne pas fonctionner lors de l'exécution. Cependant, prenez le test unitaire suivant, qui fonctionne:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  

    <bean class="test.Test.TypeB"/>
    <bean class="test.Test.TypeC"/>
    <bean class="test.Test.TypeD"/>
</beans>

et ce test unitaire:

package test;

@ContextConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public class Test {

    private @Autowired List<TypeA> 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 {}

}

Alors officiellement, vous êtes censé lier automatiquement TypeA[], pas List<TypeA>, mais la liste fonctionne bien.

Autres conseils

S'il est acceptable de remplir la liste de votre code d'application et non à partir du fichier de définition de haricots, 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 à l'intérieur du code à population que vous pouvez utiliser en toute sécurité la manière indiquée par skaffman. Si vous insistez sur la configuration XML il y a une petite bibliothèque appelée Hera pour y parvenir. configuration esentially 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>

injectera tous haut niveau grains de printemps de mise en œuvre SuperType comme List dans le grain de client.

Réponse courte:. Pas

Réponse longue: Java génériques fonctionnent par l'effacement de type, ce qui signifie que lors de 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 qu'il est censé être de type de paramètre MyType donc il ne serait pas possible de mettre en œuvre ce comportement.

Cela étant dit, il y a d'autres moyens de le faire. Le semble le plus évident d'être à l'écoute pour la création de haricots et de voir si elles sont de MyType (ou sous), puis en gardant une référence.

Il y a probablement quelques façons de le faire. L'un est la création d'un post-processeur de haricot . De cette façon, vous serez averti de chaque grain qui est créé.

En raison du code existant et manquant @Autowired je résous comme:

MyBean implements ApplicationContextAware{

  @Override
  public void setApplicationContext(ApplicationContext ctx) throws BeansException {
    final Map<String, HttpRequestHandlerTemplate> beansOfType = ctx.getBeansOfType(RequiredBean.class);
    ...
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top