2017-01-15 2 views
0

Ich verwende Spring 4.3. Ich verwende ConfigurableApplicationContext und rufe close() darauf an. Als erwartete Methode wird die mit @PreDestroy annotierte Methode bezeichnet.Schließen ApplicationContext

Aber ich habe gesehen, dass selbst wenn ich nicht nah anrufe, dann auch @PreDestroy Methoden aufgerufen werden. Ich hatte den Eindruck, dass es eine Chance auf Speicherverlust gibt, wenn close() nicht aufgerufen wird. Liege ich falsch?

Auch, wenn ich Webanwendung verwende, was ist der richtige Weg, um den Anwendungskontext zu schließen, regsiterShutdownHook?

+2

Wenn Sie eine Web-Anwendung verwenden, und verwenden Sie den normalen Weg, um einen Kontext zu schaffen (dh Verwenden Sie einen 'ContextLoaderListener' und' DispatcherServlet') Sie müssen nichts tun/kümmern, alles ist erledigt. –

+0

danke, ich verstehe Ihren Standpunkt im Falle einer Webapplikation. Der erste Teil meiner Anfrage bezieht sich auf die einfache Anwendung und der zweite bezieht sich auf die Webapplikation. Für eine einfache Anwendung, bitte teilen Sie Ihre Ansichten –

+2

Am einfachsten ist es, den Shutdown-Hook einfach zu registrieren, oder wenn Sie wirklich die Konstruktion des Kontexts steuern beide ... Oder verwenden Sie Spring Boot, die für Sie unabhängig von der Art der Anwendung kümmert . –

Antwort

1

Entweder können Sie Shutdown-Hook registrieren:

ConfigurableApplicationContext context = SpringApplication.run(Test.class, args); 
context.registerShutdownHook(); 

oder einen Listener hinzufügen, etwas zu tun:

ConfigurableApplicationContext context = SpringApplication.run(Test.class, args); 

    context.addApplicationListener(new ApplicationListener<ContextClosedEvent>() { 

     @Override 
     public void onApplicationEvent(ContextClosedEvent event) { 
      // some logic 
     } 
    }); 
Verwandte Themen