Frage

Gibt es eine Möglichkeit im Frühjahr, die ich Auto eine Liste mit allen Bohnen von einem Typ und jede seiner Subtypen bevölkern können? Ich habe eine Setter-Methode, die wie folgt aussieht:

setMyProp(List<MyType> list)

Und ich würde in allen Bohnen von MyType und alle Subklassen von MyType autowire mag.

Danke, Jeff

War es hilfreich?

Lösung

Yup, Sie können dies tun. Die Feder docs sagen:

  

Es ist auch möglich, alle zu schaffen,   Bohnen eines bestimmten Typs von der   Application durch die Zugabe von   Anmerkung zu einem Feld oder eine Methode, die   erwartet, dass eine Anordnung dieser Art.

Beachten Sie, dass es sagt, Sie brauchen ein Array zu erwarten, keine Liste. Dies macht Sinn, weil generische Typ Löschung bedeutet eine Liste zur Laufzeit nicht arbeiten kann. Allerdings nehmen die folgenden Unit-Test, die funktioniert:

<?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>

und das Gerät zu testen:

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 {}

}

So offiziell, du soll TypeA[] autowire, nicht List<TypeA>, aber die Liste funktioniert gut.

Andere Tipps

Wenn es akzeptabel, die Liste von Anwendungscode zu füllen und nicht aus der Bohne Definitionsdatei Sie die org.springframework.beans.factory.xml.XmlBeanFactory verwenden könnten und fragen sie „getBeansOfType( MyType.class )“. Dies gibt Ihnen alle Bohnen vom Typ (und Subtyp) von MyType.

Wenn Sie @Autowired in den Code verwenden können gefüllt werden Sie sicher den Weg durch skaffman erwähnt verwenden können. Wenn Sie auf XML-Konfiguration bestehen gibt es eine kleine Bibliothek mit dem Namen Hera dies zu erreichen. Esentially Konfiguration eines Szenarios, die von Ihnen beschriebenen sieht wie folgt aus:

<bean id="client" class="..">
    <property name="injectDynamicListHere">
        <hera:list class="my.custom.SuperType" />
    </property>
</bean>

Dies wird injiziert all Top-Level-Spring-Beans SuperType als List in den Client-Bean implementiert.

Kurze Antwort: no.

Lange Antwort: Java Generika von Typ Löschung arbeiten, was bedeutet, dass während der Laufzeit, die Parameter sind einfach eine Liste, nicht eine Liste eines generischen Typs. Als solche du nicht herausfinden kann, dass es Parametertyp MyType zu sein, zu verstehen ist, so dass es nicht möglich wäre, dieses Verhalten zu implementieren.

Davon abgesehen, gibt es alternative Möglichkeiten dies zu tun. Die naheliegendste scheint für Bohnen Schöpfung zu hören zu sein, und dann zu sehen, wenn sie von MyType sind (oder Unterklassen) und dann einen Verweis zu halten.

Es gibt wohl ein paar Möglichkeiten, dies zu tun. Eine davon ist eine Bohne Postprozessor zu schaffen . Auf diese Weise werden Sie von jeder Bohne benachrichtigt, die erstellt wird.

Durch Legacy-Code und fehlende @Autowired löse ich es mag:

MyBean implements ApplicationContextAware{

  @Override
  public void setApplicationContext(ApplicationContext ctx) throws BeansException {
    final Map<String, HttpRequestHandlerTemplate> beansOfType = ctx.getBeansOfType(RequiredBean.class);
    ...
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top