Close

Spring - Listening to Standard events

[Last Updated: Dec 22, 2023]

Spring core framework provides application level event firing and event listening which is based on the standard Observer design pattern.

There are built-in application events available or we can create our own custom events in spring.

This tutorial focuses on built-in application events provided by Spring container.



Spring build-in events

Build-in Event Description
ContextRefreshedEvent Event fired when an ApplicationContext gets initialized or refreshed (refreshed via context.refresh() call).
ContextStartedEvent Event fired when context.start() method is called.
ContextStoppedEvent Event fired when context.stop() method is called
ContextClosedEvent. Event fired when context.close() method is called.
RequestHandledEvent This event can only be used in spring MVC environment. It is called just after an HTTP request is completed.


How to listen to the events?

There are two ways to listen to the events.

  1. Using annotation EventListener on any bean method and injecting the specific event parameter (typically a subtype of ApplicationEvent) to the method.
       @Component
       public class MyBean{
    
           @EventListener
           public void handleContextRefresh(ContextRefreshedEvent event) {
            ...
           }
        }    

    This method is called when spring context is refreshed.

    When event is fired, a proper instance of ContextRefreshedEvent is passed by the framework.

    We can name the bean method whatever we want, that doesn't matter here.

    Note: The annotation support for event listener was added in Spring 4.2.


  2. Or We can implement ApplicationListener<E extends ApplicationEvent> to our bean and implement the method onApplicationEvent(E event)
       @Component
       public class MyBean implements ApplicationListener <ContextRefreshedEvent> {
    
           @Override
           public void onApplicationEvent(ContextRefreshedEvent event) {
             ...
           }
        }    

Examples


Listening to built-in events using @EventListener annotation

package com.logicbig.example;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.*;

@Configuration
public class BuildInAnnotationBasedEventExample {

    @Bean
    AListenerBean listenerBean() {
        return new AListenerBean();
    }

    public static void main(String[] args) {

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        context.register(BuildInAnnotationBasedEventExample.class);
        System.out.println("-- refreshing context --");
        context.refresh();
        System.out.println("-- stopping context --");
        context.stop();
        System.out.println("-- starting context --");
        context.start();
        System.out.println("-- closing context --");
        context.close();
    }

    private static class AListenerBean {

        @EventListener
        public void handleContextRefreshed(ContextRefreshedEvent event) {
            System.out.println("context refreshed event received: " + event);
        }

        @EventListener
        public void handleContextStarted(ContextStartedEvent event) {
            System.out.println("context started event received: " + event);
        }

        @EventListener
        public void handleContextStopped(ContextStoppedEvent event) {
            System.out.println("context stopped event received: " + event);
        }

        @EventListener
        public void handleContextClosed(ContextClosedEvent event) {
            System.out.println("context closed event received: " + event);
        }
    }
}

Output

-- refreshing context --
context refreshed event received: org.springframework.context.event.ContextRefreshedEvent[source=org.springframework.context.annotation.AnnotationConfigApplicationContext@25e6e3cc, started on Sat Jun 12 01:13:41 CDT 2021]
-- stopping context --
context stopped event received: org.springframework.context.event.ContextStoppedEvent[source=org.springframework.context.annotation.AnnotationConfigApplicationContext@25e6e3cc, started on Sat Jun 12 01:13:41 CDT 2021]
-- starting context --
context started event received: org.springframework.context.event.ContextStartedEvent[source=org.springframework.context.annotation.AnnotationConfigApplicationContext@25e6e3cc, started on Sat Jun 12 01:13:41 CDT 2021]
-- closing context --
context closed event received: org.springframework.context.event.ContextClosedEvent[source=org.springframework.context.annotation.AnnotationConfigApplicationContext@25e6e3cc, started on Sat Jun 12 01:13:41 CDT 2021]

Listening to built-in events by implementing ApplicationListener

package com.logicbig.example;

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent;

@Configuration
public class BuildInListenerBasedEventExample {

    @Bean
    AListenerBean listenerBean() {
        return new AListenerBean();
    }

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
                BuildInListenerBasedEventExample.class);
    }

    private static class AListenerBean implements ApplicationListener<ContextRefreshedEvent> {

        @Override
        public void onApplicationEvent(ContextRefreshedEvent event) {
            System.out.println("context refreshed event received: " + event);
        }
    }
}

Output

context refreshed event received: org.springframework.context.event.ContextRefreshedEvent[source=org.springframework.context.annotation.AnnotationConfigApplicationContext@7443db83, started on Sat Jun 12 01:13:33 CDT 2021]

Following example shows that instead of a specific event ContextRefreshedEvent (in last example) we can consume multiple events by using ApplicationEvent . All Spring standard events implements this interface.

package com.logicbig.example;

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BuildInListenerBasedMultipleEventExample {

    @Bean
    AListenerBean listenerBean () {
        return new AListenerBean();
    }

    public static void main (String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
                            BuildInListenerBasedMultipleEventExample.class);
        context.stop();
        context.start();
        context.close();

    }

    private static class AListenerBean implements ApplicationListener<ApplicationEvent> {

        @Override
        public void onApplicationEvent (ApplicationEvent event) {
            System.out.println("event received: "+event);
        }
    }
}

Output

event received: org.springframework.context.event.ContextRefreshedEvent[source=org.springframework.context.annotation.AnnotationConfigApplicationContext@29e6e416, started on Sat Jun 12 01:13:17 CDT 2021]
event received: org.springframework.context.event.ContextStoppedEvent[source=org.springframework.context.annotation.AnnotationConfigApplicationContext@29e6e416, started on Sat Jun 12 01:13:17 CDT 2021]
event received: org.springframework.context.event.ContextStartedEvent[source=org.springframework.context.annotation.AnnotationConfigApplicationContext@29e6e416, started on Sat Jun 12 01:13:17 CDT 2021]
event received: org.springframework.context.event.ContextClosedEvent[source=org.springframework.context.annotation.AnnotationConfigApplicationContext@29e6e416, started on Sat Jun 12 01:13:17 CDT 2021]

Example Project

Dependencies and Technologies Used:

  • spring-context 6.1.2 (Spring Context)
     Version Compatibility: 4.2.0.RELEASE - 6.1.2Version List
    ×

    Version compatibilities of spring-context with this example:

    • 4.2.0.RELEASE
    • 4.2.1.RELEASE
    • 4.2.2.RELEASE
    • 4.2.3.RELEASE
    • 4.2.4.RELEASE
    • 4.2.5.RELEASE
    • 4.2.6.RELEASE
    • 4.2.7.RELEASE
    • 4.2.8.RELEASE
    • 4.2.9.RELEASE
    • 4.3.0.RELEASE
    • 4.3.1.RELEASE
    • 4.3.2.RELEASE
    • 4.3.3.RELEASE
    • 4.3.4.RELEASE
    • 4.3.5.RELEASE
    • 4.3.6.RELEASE
    • 4.3.7.RELEASE
    • 4.3.8.RELEASE
    • 4.3.9.RELEASE
    • 4.3.10.RELEASE
    • 4.3.11.RELEASE
    • 4.3.12.RELEASE
    • 4.3.13.RELEASE
    • 4.3.14.RELEASE
    • 4.3.15.RELEASE
    • 4.3.16.RELEASE
    • 4.3.17.RELEASE
    • 4.3.18.RELEASE
    • 4.3.19.RELEASE
    • 4.3.20.RELEASE
    • 4.3.21.RELEASE
    • 4.3.22.RELEASE
    • 4.3.23.RELEASE
    • 4.3.24.RELEASE
    • 4.3.25.RELEASE
    • 4.3.26.RELEASE
    • 4.3.27.RELEASE
    • 4.3.28.RELEASE
    • 4.3.29.RELEASE
    • 4.3.30.RELEASE
    • 5.0.0.RELEASE
    • 5.0.1.RELEASE
    • 5.0.2.RELEASE
    • 5.0.3.RELEASE
    • 5.0.4.RELEASE
    • 5.0.5.RELEASE
    • 5.0.6.RELEASE
    • 5.0.7.RELEASE
    • 5.0.8.RELEASE
    • 5.0.9.RELEASE
    • 5.0.10.RELEASE
    • 5.0.11.RELEASE
    • 5.0.12.RELEASE
    • 5.0.13.RELEASE
    • 5.0.14.RELEASE
    • 5.0.15.RELEASE
    • 5.0.16.RELEASE
    • 5.0.17.RELEASE
    • 5.0.18.RELEASE
    • 5.0.19.RELEASE
    • 5.0.20.RELEASE
    • 5.1.0.RELEASE
    • 5.1.1.RELEASE
    • 5.1.2.RELEASE
    • 5.1.3.RELEASE
    • 5.1.4.RELEASE
    • 5.1.5.RELEASE
    • 5.1.6.RELEASE
    • 5.1.7.RELEASE
    • 5.1.8.RELEASE
    • 5.1.9.RELEASE
    • 5.1.10.RELEASE
    • 5.1.11.RELEASE
    • 5.1.12.RELEASE
    • 5.1.13.RELEASE
    • 5.1.14.RELEASE
    • 5.1.15.RELEASE
    • 5.1.16.RELEASE
    • 5.1.17.RELEASE
    • 5.1.18.RELEASE
    • 5.1.19.RELEASE
    • 5.1.20.RELEASE
    • 5.2.0.RELEASE
    • 5.2.1.RELEASE
    • 5.2.2.RELEASE
    • 5.2.3.RELEASE
    • 5.2.4.RELEASE
    • 5.2.5.RELEASE
    • 5.2.6.RELEASE
    • 5.2.7.RELEASE
    • 5.2.8.RELEASE
    • 5.2.9.RELEASE
    • 5.2.10.RELEASE
    • 5.2.11.RELEASE
    • 5.2.12.RELEASE
    • 5.2.13.RELEASE
    • 5.2.14.RELEASE
    • 5.2.15.RELEASE
    • 5.2.16.RELEASE
    • 5.2.17.RELEASE
    • 5.2.18.RELEASE
    • 5.2.19.RELEASE
    • 5.2.20.RELEASE
    • 5.2.21.RELEASE
    • 5.2.22.RELEASE
    • 5.2.23.RELEASE
    • 5.2.24.RELEASE
    • 5.2.25.RELEASE
    • 5.3.0
    • 5.3.1
    • 5.3.2
    • 5.3.3
    • 5.3.4
    • 5.3.5
    • 5.3.6
    • 5.3.7
    • 5.3.8
    • 5.3.9
    • 5.3.10
    • 5.3.11
    • 5.3.12
    • 5.3.13
    • 5.3.14
    • 5.3.15
    • 5.3.16
    • 5.3.17
    • 5.3.18
    • 5.3.19
    • 5.3.20
    • 5.3.21
    • 5.3.22
    • 5.3.23
    • 5.3.24
    • 5.3.25
    • 5.3.26
    • 5.3.27
    • 5.3.28
    • 5.3.29
    • 5.3.30
    • 5.3.31
    • Compatible Java Version: 17+
    • 6.0.0
    • 6.0.1
    • 6.0.2
    • 6.0.3
    • 6.0.4
    • 6.0.5
    • 6.0.6
    • 6.0.7
    • 6.0.8
    • 6.0.9
    • 6.0.10
    • 6.0.11
    • 6.0.12
    • 6.0.13
    • 6.0.14
    • 6.0.15
    • 6.1.0
    • 6.1.1
    • 6.1.2

    Versions in green have been tested.

  • JDK 17
  • Maven 3.8.1

Spring - Event handling provided Select All Download
  • spring-event-example
    • src
      • main
        • java
          • com
            • logicbig
              • example
                • BuildInAnnotationBasedEventExample.java

    See Also