Ist es möglich, eine Spring Bean zur Laufzeit neu zu initialisieren?
Mein Bean verwendet statische Einstellungen, die sich in einigen Fällen ändern, und dann muss ich das Bean neu initialisieren.
Ist es möglich, eine Spring Bean zur Laufzeit neu zu initialisieren?
Mein Bean verwendet statische Einstellungen, die sich in einigen Fällen ändern, und dann muss ich das Bean neu initialisieren.
Amith Kumar
Sie haben drei Optionen zum Aktualisieren von Singleton-Beans im Frühjahrskontext. Sie können eine für Ihren Anwendungsfall geeignete auswählen:
Reload-Methode In the Bean
Erstellen Sie eine Methode in Ihrer Bean, die ihre Eigenschaften aktualisiert/neu lädt. Greifen Sie basierend auf Ihrem Trigger auf die Bean aus dem Frühlingskontext zu und rufen Sie dann die Reload-Methode auf, um die Bean-Eigenschaften zu aktualisieren (da Singleton) wird sie auch im Frühlingskontext aktualisiert und überall dort, wo sie automatisch verdrahtet/injiziert wird.
Bean in der Registrierung löschen und registrieren
Sie können verwenden DefaultSingletonBeanRegistry
zum Entfernen und erneuten Registrieren Ihrer Bean. Der einzige Nachteil dabei ist, dass alte Instanzen von bereits automatisch verdrahteten/injizierten Beans in Consumer-Klassen nicht aktualisiert/neu geladen werden.
DefaultSingletonBeanRegistry registry = (DefaultSingletonBeanRegistry) context.getBeanFactory();
registry.destroySingleton({yourbean}) //destroys the bean object
registry.registerSingleton({yourbeanname}, {newbeanobject}) //add to singleton beans cache
@RefreshScope
Nützlich zum Aktualisieren von Bean-Werteigenschaften aus Konfigurationsänderungen. Aber es hat einen sehr begrenzten und spezifischen Zweck. Ressource um mehr darüber zu lesen.
Es ist so schwer, Eigenschaften neu zu laden.
– Alex78191
18. März 2019 um 17:55 Uhr
Warum nicht einfach bean = applicationContext.getBean(Bean.class)
?
– Alex78191
18. März 2019 um 18:23 Uhr
Weil es Ihnen nur die bereits geladene Bean aus dem Kontext holt und sie nicht aktualisiert/neu lädt. Ich verstehe nicht, wenn du sagst, es ist so schwer ?
– Amith Kumar
18. März 2019 um 18:26 Uhr
In meinem Fall wird eine neue Bohne zurückgegeben applicationContext.getBean(Bean.class)
. Es ist wegen @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
.
– Alex78191
18. März 2019 um 18:47 Uhr
Ja, diese Frage gilt nicht für Nicht-Singleton-Bohnen. Der Prototyp-Umfang gilt pro Verwendung, sodass Ihre Bean für jede Anforderung neu erstellt wird, sodass keine Frage des Neuladens besteht.
– Amith Kumar
18. März 2019 um 20:07 Uhr
Sie können über das Kontextrecht auf die Bean zugreifen und dann einfach eine Methode erstellen
update
innerhalb der Bean-Klasse, die Sie basierend auf Ihrem Trigger aufrufen können, um die Bean zu aktualisieren.– Amith Kumar
6. Juli 2018 um 22:04 Uhr
Meine Bean ist eine Funktion innerhalb einer Konfigurationsklasse. Funktioniert eine Update-Funktion für diese Konstellation?
– Fip
6. Juli 2018 um 22:34 Uhr
Ja, selbst wenn Sie eine Bean aus einer Methode erstellen, ist sie immer noch ein Objekt im Spring-Kontext und kann wie auf jede andere Bean aufgerufen werden.
– Amith Kumar
6. Juli 2018 um 23:01 Uhr