Beans Nachbearbeitungsreihenfolge ohne explizite Konfiguration ändern
-
11-12-2019 - |
Frage
Mir ist bewusst, dass die Reihenfolge des Bean-Ladens implizit durch Abhängigkeiten und transitive Abhängigkeiten bestimmt wird.
Stellen Sie sich vor, Sie haben eine Reihe von kommentierten Beans, die Ihnen Metadaten liefern, die Sie auf eine andere Gruppe von AwareBeans anwenden möchten.Erst nachdem Sie alle Metadaten von N Beans gesammelt haben, können Sie die AwareBeans nachbearbeiten.Sie verwenden normalerweise org.springframework.beans.factory.config.BeanPostProcessor
für solche Sachen.Wie gehe ich mit der Bestellung um?Ich denke, dass sogar das Einrichten depends-on
explizit hat Abhängigkeiten in Bezug auf die Ladereihenfolge keinen Vorrang, oder?
Es gibt eine Schnittstelle org.springframework.core.Ordered
dies hängt nur von der Reihenfolge der angewendeten Beanpostprozessoren ab, nicht jedoch von der Reihenfolge der Bohnen.
Ich könnte verwenden org.springframework.beans.factory.config.BeanFactoryPostProcessor
die Bean-Definition enthält jedoch nicht genügend Informationen vor der Bean-Instanziierung.Beispielsweise beanDef.getBeanClass()
gibt den Namen der Bean-Klasse usw. zurück.
Könntest du dir auf irgendeine andere Weise vorstellen, wie ich tun soll, was ich will?
Lösung 2
Ich habe es gelöst mit org.springframework.beans.factory.config.BeanFactoryPostProcessor
und Laden von Klassen nach Klassenladeprogramm, damit ich Reflektion verwenden kann, um die Anmerkungen zu erfassen.Ich denke, es sollte nichts kaputt machen, denn danach, wenn der Frühling Klassen lädt, prüft der Klassenlader der Bean-Klassen, ob die Klasse bereits geladen ist und wenn ja, lädt er sie nicht.Ansonsten lädt es es.
Andere Tipps
Sie können:
a) Fügen Sie alle Ihre Metadaten-Beans in Ihre ein BeanPostProcessor
.
b) Lassen Sie Ihren Postprozessor beim Start aktiv alle Metadaten-Beans aus dem Anwendungskontext abrufen.
Jeder Weg hat Vor- und Nachteile, aber der Effekt ist der gleiche:nach BeanPostProcessor
nach der Konstruktion wird auch jede Metadaten-Bean bereits nachbearbeitet.