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
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.
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
.
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:
Dadurch werden alle Spring-Beans der obersten Ebene eingefügt, die SuperType
als List
in die Client-Bean implementieren.
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.