2017-01-25 3 views
0

Ich habe bei mehreren stackoverflow Fragen gelesen, dass applicationContext.getbean eine schlechte Idee ist.Best Practice, um Frühlingsbohnen des gegebenen Typs zu erhalten

Why is Spring's ApplicationContext.getBean considered bad?

Ich möchte wissen, ob es eine bessere Art und Weise des Abtastens Bohnen eines bestimmten Typs im Frühjahr ist.

Mein Anwendungsfall ist es, Beans eines bestimmten Typs im Frühjahr zu starten und einige Methoden auf diesen Bohnen aufzurufen.

Von dem, was ich weiß gibt es nur zwei Möglichkeiten, dies zu tun.

  1. Entweder den Autowire-Anwendungskontext in eine Spring-Bean kopieren und appContext.getBeansOfType verwenden.
  2. Haken in einem Post-Prozessor und filtert unsere Bohnen von bestimmtem Typ von

    if (Bean-Instanz vom Typ)

ich in einem Post-Prozessor fühle Einhaken nur Bohnen eines bestimmten Typs zu verarbeiten, nicht a gute Idee. Weil das alle Bean-Initialisierungen abfängt.

Kann jemand einen besseren Ansatz zur Lösung meines Anwendungsfalls vorschlagen? (getBeans eines gegebenen Typs)

Antwort

1

Die Feder hat eine spezielle Handhabung von List autowired Parameter. Wenn Sie eine Bean angeben, z. dies wie:

@Component 
class MyBean { 
    @Autowired 
    MyBean(List<MyType> listOfMytype) { 

    } 
} 

Dann Frühjahr wird Ihre application für eine Bean vom Typ List<MyType>, nicht suchen, sondern es wird für alle Bohnen suchen, die MyType implementieren und diese als Liste (which may suck if you actually want to get a list injected) injizieren. Somit erhalten Sie alle Beans eines bestimmten Typs.

+0

danke für die Antwort. Ich habe noch eine Frage. Was ist bei der Verwendung von applicationContext.getBeansOfType in diesem Fall falsch? Wir verbinden den Code nicht mit einer konkreten Klasse. Wir koppeln es mit einer abstrakten Klasse (oder möglicherweise einer Schnittstelle), die wir sowieso tun, indem wir eine Liste von Beans dieses Typs autowiren. – yaswanth

+0

@yaswanth: Ich denke, das passt viel besser zu der Frage, die du verlinkt hast. Zu meiner Überraschung hat keine der vorhandenen Antworten in dieser Frage ein direktes Beispiel, wo Sie die Effekte sehen können. Also habe ich eins hinzugefügt: http://stackoverflow.com/a/41853545/327301 – yankee