Gracefully Shutdown Spring Application Container

This tutorial shows you how to register a shutdown hook with the JVM in a non-web application context. By default the ApplicationContext does not have a shutdown hook and does not have any exposed methods to configure this. These methods are all encapsulated in the ConfigurableApplicationContext. This interface exposes a couple of extra configuration and lifecycle management methods like close(); and registerShutdownHook();. When you call the registerShutdownHook() method, this registers a shutdown hook with the JVM and ensures a graceful shutdown and calls the relevant destroy methods on your singleton beans.

Adding init and destroy methods

This spring managed bean has a init and a destroy method. These methods will be called when the bean is created and destroyed.

package com.memorynotfound.spring.core.lifecycle;

public class Logger {

    public void init(){
        System.out.println("- - - initializing logger bean");

    public void destroy(){
        System.out.println("- - - destroying logger bean");

Configuring the bean

We configure the initializing and destruction methods using xml configuration. The init-method method registers an initialization method that will be called when the bean is created. The destroy-method method registers a destruction method that will be called before the JVM is shutdown. The lifecycle methods will only be invoked on a singleton bean.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=""

    <bean class="com.memorynotfound.spring.core.lifecycle.Logger"


Register a Shutdown hook with the JVM

The ConfigurableApplicationContext exposes the close() and registerShutdownHook() methods. You can explicitly call the close() method. Or call the registerShutdownHook() method. Both must be used in a non-web application context. These methods will call the registered destruction methods of singleton beans before the JVM is closed.

package com.memorynotfound.spring.core.lifecycle;

import org.springframework.context.ConfigurableApplicationContext;

public class Run {

    public static void main(String... args) throws InterruptedException {
        ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("app-config.xml");
        // implicit shutdown hook

        // or explicit close method


As you can see, the destruction method of our singleton bean is called.

- - - initializing logger bean
- - - destroying logger bean



You may also like...