Wie schließe ich einen Spring ApplicationContext?

83

Nach Abschluss meiner Bewerbung möchte ich den Frühlingskontext schließen.
Der relevante Code hat eine ApplicationContextReferenz, aber ich konnte keine closeMethode finden.

Avner Levy
quelle

Antworten:

149

Niedergeschlagen Ihr ApplicationContextzu ConfigurableApplicationContextdem definierten close()Methode:

((ConfigurableApplicationContext)appCtx).close();
Tomasz Nurkiewicz
quelle
13
Sie können auch zuAbstractApplicationContext
eeezyy
3
@eeezyy - Da AbstractApplicationContextes sich um eine Klasse handelt und ConfigurableApplicationContextes sich um eine von dieser Klasse implementierte Schnittstelle handelt, ist es in den meisten Fällen wahrscheinlich besser, letztere zu verwenden.
Periata Breatta
3
Wie ConfigurableApplicationContextjetzt erweitert Closable(weiß nicht, in welcher Version diese Änderung vorgenommen wurde, aber die Dokumente für 4.2.x zeigen es, während 3.0.x dies nicht tut), ist eine viel kürzere Version ((Closable)context).close();.
Periata Breatta
6
Es gibt jetzt auch eine AutoCloseableImplementierung, was bedeutet, dass jetzt ein Versuch mit Ressourcen verwendet werden kann, solange Sie Ihren Kontext in einer Variablen speichern, in der die AutoCloseableSchnittstelle sichtbar ist, dhtry (ConfigurableApplicationContext context = new ....) { /* your code goes here */ } // context is closed when you leave the try block
Periata Breatta
Wo soll ich den Kontext schließen? Ich habe eine Listener-Anwendung, die ständig Nachrichten über die onMessage () -Methode der MessageListener-Klasse abruft. In welchem ​​Teil sollte ich den Anwendungskontext schließen, um den Executor endgültig herunterzufahren?
Wachs
36

Sie müssen einen Shutdown-Hook bei der JVM registrieren, wie unten gezeigt:

((AbstractApplicationContext)appCtx).registerShutdownHook();

Weitere Informationen finden Sie unter: Spring-Handbuch: 3.6.1.6 Herunterfahren des Spring IoC-Containers in Nicht-Webanwendungen

Dogbane
quelle
Seltsamerweise funktioniert dies in einer Testklasse nicht für mich, aber die Verwendung der Antwort von Avner Levy am Ende von main () funktioniert.
JReader
1
@JReader - Shutdown-Hooks sind unter vielen Umständen nicht zuverlässig und werden von den meisten Test-Frameworks (da die VM normalerweise nicht zwischen dem Ausführen von Tests beendet wird) oder einigen Anwendungs-Frameworks (z. B. Servlets - alles, was möglich ist) nicht ausgeführt Beenden und erneutes Laden einer Anwendung, ohne die virtuelle Maschine zu beenden. Sie sollten sie wahrscheinlich nicht verwenden, es sei denn, Sie wissen, was Sie tun und wie Ihr Code verwendet wird.
Periata Breatta
12

Wenn Sie den Kontext wie folgt initialisieren

ApplicationContext context = new ClassPathXmlApplicationContext(beansXML); 

sauberer Kontext wie diese

((ClassPathXmlApplicationContext) context).close();
Ashish Gaikwad
quelle
12

Wenn Java SE 7 und höher nicht geschlossen wird, verwenden Sie try-with-resources, um sicherzustellen, dass jede Ressource am Ende der Anweisung geschlossen wird.

try(final AbstractApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[]{"classpath*:META-INF/spring/*.xml" }))
{
     //write your code
}
Chirag
quelle
1

Schritte zum Schließen des ApplicationContextObjekts

  1. Geben Sie Cast the ApplicationContextObject to ConfigurableApplicationContextObject ein.
  2. Rufen Sie dann das Objekt close auf.

Beispiel:

 ApplicationContext context = new ClassPathXmlApplicationContext("mybeans.xml");

((ConfigurableApplicationContext)context ).close();
pushpendra yadav
quelle
1
public static void main(String[] args) {
    ApplicationContext context=new ClassPathXmlApplicationContext("SpringCnf.xml");
    Resturant rstro1=(Resturant)context.getBean("resturantBean");
    rstro1.setWelcome("hello user");
    rstro1.welcomeNote();
    ((ClassPathXmlApplicationContext) context).close();
Meenakshi Singh
quelle
1
Bei der Beantwortung eines alten Beitrags wäre es hilfreich, wenn Sie Ihrer Antwort einen Kontext und nicht nur Code geben könnten, da dies für andere möglicherweise nützlicher wäre.
David Buck