Ich habe einen Anwendungsfall, in dem ich eine (nicht statische) Methode in der Bean nur einmal beim Laden von ApplicationContext aufrufen muss. Ist es in Ordnung, wenn ich dafür MethodInvokingFactoryBean verwende? Oder haben wir eine bessere Lösung?
Als Randnotiz verwende ich ConfigContextLoaderListener, um den Anwendungskontext in eine Webanwendung zu laden. Und wenn Bean 'A' instanziiert wird, rufen Sie einfach einmal methodA () auf.
Wie kann das gut gemacht werden?
Um den @ PostConstruct-Vorschlag in anderen Antworten zu erweitern, ist dies meiner Meinung nach wirklich die beste Lösung.
quelle
<context:component-scan>
funktioniert auch und kann nützlich sein, um die Startzeit zu verkürzen, wenn Sie große Nicht-Spring-Bibliotheken in Ihrem Klassenpfad haben.Es sind drei verschiedene Ansätze zu berücksichtigen, wie in der Referenz beschrieben
Verwenden Sie das Attribut init-method
Vorteile:
Nachteile:
Implementieren Sie InitializingBean
Vorteile:
Nachteile:
Verwenden Sie die Lebenszyklusanmerkung JSR-250 @PostConstruct
Vorteile:
Nachteile:
quelle
@PostConstruct
genau weil es Teil der Klasse ist, dass es die Methode benötigt, die am Ende der Initialisierungsverarbeitung aufgerufen wird.Haben Sie versucht zu implementieren
InitializingBean
? Es klingt genau so, wie Sie es suchen.Der Nachteil ist, dass Ihre Bohne frühlingsbewusst wird, aber in den meisten Anwendungen ist das nicht so schlimm.
quelle
Sie können dazu einen benutzerdefinierten BeanPostProcessor in Ihrem Anwendungskontext bereitstellen . Wenn es Ihnen nichts ausmacht, eine Spring-Schnittstelle in Ihrer Bean zu implementieren, können Sie die InitializingBean- Schnittstelle oder die Direktive "init-method" (gleicher Link) verwenden.
quelle
Um weitere Verwirrung über die beiden Ansätze zu beseitigen, dh die Verwendung von
@PostConstruct
undinit-method="init"
Aus persönlicher Erfahrung wurde mir klar, dass die Verwendung von (1) nur in einem Servlet-Container funktioniert, während (2) in jeder Umgebung funktioniert, selbst in Desktop-Anwendungen. Wenn Sie Spring in einer eigenständigen Anwendung verwenden würden, müssten Sie (2) verwenden, um diesen "Aufruf dieser Methode nach der Initialisierung" auszuführen.
quelle
@PostConstruct
(in einer Spring-basierten App) an die Lebensdauer des Spring-Kontexts gebunden. Solche Kontexte können in allen Arten von Anwendungen verwendet werden.