2016-04-23 16 views
3

Was könnte eine mögliche Beispielanwendung von Destroy-Methode in einer realen Anwendung sein? Warum möchte eine laufende Anwendung ihre Beans zerstören? Wenn die Beans vom Spring-Container für die Webanwendung beispielsweise über ContextLoaderListener erstellt werden, wie können dann diese Beans neu erstellt werden, da der Container bereits gestartet wurde. Gibt es eine Möglichkeit, den Feder-IoC-Container neu zu starten, ohne den Anwendungsserver neu zu starten?Spring Bean Zerstörungsmethode

Antwort

4

Ein Beispiel wäre ein DataSource oder eine Ressource, die aufgeräumt werden muss. Sie könnte so etwas wie dieses:

@Bean(destroyMethod = "close") 
DataSource dataSource() { 
.... 
} 

Diese in Umgebungen mit mehreren Classloader wie einem Anwendungsserver Speicherlecks zu verhindern, besonders wichtig sein kann.

Es ist manchmal der Fall, dass dies redundant ist, da die zugrunde liegende Ressource ihre eigene Bereinigung durchführen kann (z. B. als Teil eines contextDestroyed Ereignisses im Servlet-Lebenszyklus), aber Sie sollten dies immer überprüfen.

Diese Federn docs sind auch eine nützliche Referenz. Das Beispiel dort zitierte ähnelt:

<bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="cleanup"/> 

die Bean-Klasse Dann:

public class ExampleBean { 

    public void cleanup() { 
     // do some destruction work (like releasing pooled connections) 
    } 
} 

Es ist möglich, einen Kontext zu aktualisieren. Diese answer bietet eine gute Erklärung davon und wann Sie es tun möchten.

1

unten sind meine Ansichten:

Was eine mögliche Beispiel für die Verwendung von destroy-Methode in einer realen Welt Anwendung sein könnte?

Für die meisten Anwendungen, vielleicht konzentrieren wir uns auf reale Unternehmen meist, so werden wir nicht oft die Szenen treffen, wo Methode zerstören definieren müssen. Aber wenn Sie einige grundlegende Komponenten oder Middle gerecht zu werden, müssen Sie die Aufmerksamkeit auf Resource Management, wie Datenbankverbindung zahlen, Speichernutzung, Disk Usage, etc. Sie müssen wissen, wie unnötige Ressourcenbestände lösen klar oder dies wird zu ernsthaften Problemen führen.

Wenn die Beans vom Spring-Container für die Webanwendung erstellt werden, z. B. ContextLoaderListener, wie können dann diese Beans neu erstellt werden, weil der Container bereits gestartet wurde?

Frühling Container ist nicht nur für Webapplikation es für gemeinsame Java-Anwendung dienen kann (Hauptanwendung).Frühling Container hat zwei verschiedene Bean Typ (Singleton und Prototype), Singleton Bean nur vorab instanziiert, wenn Frühling Container Finish bis zu starten, während Prototype Bean wird durch den Aufruf instanziiert werden getBean jedes Mal.

Gibt es eine Möglichkeit, den Feder-IoC-Container neu zu starten, ohne den Anwendungsserver neu zu starten?

Feder IoC Container beginnt durch Aufrufen AbstractRefreshableApplicationContext.refresh() Methode instanziert zu werden. Diese Methode zerstört den gesamten Spring IoC Container, wenn Sie zuvor den Container instanziiert haben. Sie können diese Methode also aufrufen, um den Container erneut zu instanziieren. Wenn Sie Frühling IoC Mechanismus verstehen wollen, empfehle ich Ihnen, die Frühlings-Quellcode lesen: Federkern, feder Bohnen, feder Kontext.

Ich hoffe, Ihnen zu helfen.

0

Ich habe Bohnen in einer Spring-Anwendung gesehen, die direkt oder indirekt non-Daemon-Threads gestartet hat. Dann wurde es unmöglich, den Prozess zu stoppen, ohne den Prozess zu beenden. Dies wirkte sich auf einige Jenkins-Jobs aus, bei denen automatisierte Tests durchgeführt wurden. So gibt es viele Beispiele aus der realen Welt, besonders in einer DevOps-Welt