Frühjahr Liste Bohnen nach Art
Gibt es eine Möglichkeit im Frühjahr, dass ich automatische Auffüllen einer Liste, die alle beans eines Typs UND Untertyps? Ich habe einen setter-Methode sieht wie folgt aus:
setMyProp(List<MyType> list)
Und ich möchte autowire in irgendeiner Bohnen von MyType und alle Unterklassen von MyType.
Dank,
Jeff
- Wie wollen Sie diese Liste, um die Arbeit mit Prototypen? Sollte es enthalten nur ein Beispiel, jede Instanz Hinzugefügt (memory leak) oder durch irgendeine form von weak reference Liste.
- alle Bohnen werden von singletons in meinem Fall
Du musst angemeldet sein, um einen Kommentar abzugeben.
Yup, können Sie dies tun. Der Frühling docs sagen:
Beachten Sie, dass es sagt, Sie müssen erwarten, dass ein array, keine Liste. Dies macht Sinn, da die generischen Typ-Löschung bedeutet, dass die Liste funktionieren möglicherweise nicht während der Laufzeit. Jedoch, nehmen Sie die folgenden unit-test, der funktioniert:
diesem Gerät testen:
Also offiziell, Sie sind doch autowire
TypeA[]
, nichtList<TypeA>
, aber die Liste funktioniert gut.Wenn es ist akzeptabel, füllen die Liste aus Ihrer Anwendung code, und nicht innerhalb der bean-definition-Datei, die Sie verwenden könnten, die
org.springframework.beans.factory.xml.XmlBeanFactory
und bitten Sie Sie,"getBeansOfType( MyType.class )
". Dies gibt Ihnen alle Bohnen der Art (und Subtyp) vonMyType
.Wenn Sie verwenden können
@Autowired
in dem code aufgefüllt werden, Sie können sicher die Möglichkeit erwähnt, durch skaffman. Wenn Sie darauf bestehen, auf XML-Konfiguration es gibt eine kleine Bibliothek namens Hera um dies zu erreichen. Esentially Konfiguration ein Szenario beschrieben, indem Sie sieht wie folgt aus:Diese wird Spritzen alle top-level-Spring-Bean-Implementierung
SuperType
alsList
in die Kunde-bean.Kurze Antwort: Nein.
Lange Antwort: Java generics arbeiten nach Art der Auslöschung, was bedeutet, dass zur Laufzeit-parameter ist einfach eine Liste, nicht eine Liste von generischen Typen. Als solche können Sie nicht herausfinden, dass es gemeint ist, der parameter type MyType, so würde es nicht möglich sein, implementieren dieses Verhalten.
Dass gesagt wird, es gibt alternative Möglichkeiten, dies zu tun. Die naheliegendste scheint zu sein, zu hören bean Schöpfung und dann zu sehen, wenn Sie von MyType (oder Unterklassen) und dann halten einen Verweis.
Gibt es wohl ein paar Möglichkeiten, dies zu tun. Man ist erstellen Sie eine bean-post-Prozessor. Auf diese Weise werden Sie benachrichtigt, jede Bohne, die erstellt wird.
Durch legacy-code und fehlende @Autowired ich es lösen wie: