Spring Listen Bohnen nach Typ

7

Gibt es eine Möglichkeit im Frühling, dass ich automatisch eine Liste mit allen Beans eines Typs UND eines seiner Subtypen füllen kann? Ich habe eine Setter-Methode, die wie folgt aussieht:

%Vor%

Und ich möchte in allen Beans von MyType und allen Unterklassen von MyType autowire.

Danke, Jeff

    
Jeff Storey 20.09.2009, 02:41
quelle

5 Antworten

24

Ja, du kannst das machen. Die Feder Dokumentation sagt:

  

Es ist auch möglich, alle zur Verfügung zu stellen   Bohnen eines bestimmten Typs aus der   ApplicationContext durch Hinzufügen der   Anmerkung zu einem Feld oder Methode, die   erwartet ein Array dieses Typs.

Bitte beachten Sie, dass Sie ein Array und keine Liste erwarten müssen. Dies ist sinnvoll, da eine generische Art der Löschung bedeutet, dass eine Liste zur Laufzeit nicht funktioniert. Nehmen Sie jedoch den folgenden Komponententest, der funktioniert:

%Vor%

und dieser Komponententest:

%Vor%

Sie sollten also offiziell TypeA[] , nicht List<TypeA> , autowire, aber die Liste funktioniert gut.

    
skaffman 20.09.2009, 08:55
quelle
5

Wenn es akzeptabel ist, die Liste aus Ihrem Anwendungscode und nicht aus der Bean-Definitionsdatei zu füllen, können Sie org.springframework.beans.factory.xml.XmlBeanFactory verwenden und " getBeansOfType( MyType.class ) " eingeben. Dies gibt Ihnen alle Beans vom Typ (und Subtyp) von MyType .

    
tangens 20.09.2009 07:56
quelle
3

Wenn Sie @Autowired innerhalb des Codes verwenden können, können Sie sicher die von skaffman angegebene Methode verwenden. Wenn Sie auf XML-Konfiguration bestehen, gibt es eine kleine Bibliothek namens Hera , um dies zu erreichen. Die grundlegende Konfiguration eines von Ihnen beschriebenen Szenarios sieht folgendermaßen aus:

%Vor%

Dadurch werden alle Spring-Beans der obersten Ebene eingefügt, die SuperType als List in die Client-Bean implementieren.

    
Oliver Gierke 22.09.2009 12:28
quelle
0

Kurze Antwort: Nein.

Lange Antwort: Java-Generika funktionieren nach Typ löschen, was bedeutet, dass dieser Parameter zur Laufzeit einfach eine Liste ist, keine Liste eines generischen Typs. Als solche können Sie nicht herausfinden, dass es vom Parametertyp MyType sein soll, so dass es nicht möglich wäre, dieses Verhalten zu implementieren.

Davon abgesehen gibt es alternative Möglichkeiten, dies zu tun. Am offensichtlichsten scheint es zu sein, auf die Erzeugung von Beans zu warten und dann zu sehen, ob sie MyType (oder Unterklassen) sind und dann einen Verweis behalten.

Es gibt wahrscheinlich einige Möglichkeiten, dies zu tun. Einer ist erstellt einen Bean-Post-Prozessor . Auf diese Weise werden Sie über jede erstellte Bean benachrichtigt.

    
cletus 20.09.2009 02:53
quelle
0

Wegen altem Code und fehlendem @Autowired löse ich es wie folgt:

%Vor%     
GKislin 29.09.2015 14:19
quelle

Tags und Links