Sunday, 23 September 2018

Event handling in spring [ContextRefreshedEvent and ContextClosedEvent] | Spring event handling

Master Spring & Java Development!

Subscribe to Ram N Java for clean, beginner-friendly coding guides!

🔔 Subscribe to Ram N Java

Overview: Built-in Events in Spring

The Spring Framework provides built-in lifecycle events that are automatically published by the ApplicationContext. Among the most essential lifecycle events are ContextRefreshedEvent and ContextClosedEvent. These events allow you to run initialization tasks right after the container is ready, or execute cleanup logic just before the container is destroyed.

In this guide, you will learn the purpose of both lifecycle events and how to handle them using listeners in your Spring application.

Understanding the Core Events

Spring automatically fires these events at distinct stages of the application lifecycle:

  • ContextRefreshedEvent: Published when the ApplicationContext is either initialized or refreshed (for example, using refresh() on ConfigurableApplicationContext). All beans are instantiated, dependencies are injected, and the container is fully active.
  • ContextClosedEvent: Published when the ApplicationContext is closed (for example, using close()). All singleton beans are about to be destroyed, making it the ideal phase for resource teardown.

Handling Lifecycle Events

  1. Implement ApplicationListener: Create listener classes implementing ApplicationListener<ContextRefreshedEvent> and ApplicationListener<ContextClosedEvent>.
  2. Override onApplicationEvent: Put your post-startup logic or cleanup code inside the respective onApplicationEvent() callback method.
  3. Register the Listeners: Register the listeners as managed Spring beans (using XML or annotations) so the container automatically detects and invokes them.

Recommended Next Videos from Ram N Java


Click here to watch on Youtube:
https://www.youtube.com/watch?v=-gIYdk7CPrc&list=UUhwKlOVR041tngjerWxVccw

Click the below Image to Enlarge:
Event handling in spring [ContextRefreshedEvent and ContextClosedEvent] | Spring event handling

Event handling in spring [ContextRefreshedEvent and ContextClosedEvent] | Spring event handling

Event handling in spring [ContextRefreshedEvent and ContextClosedEvent] | Spring event handling

Event handling in spring [ContextRefreshedEvent and ContextClosedEvent] | Spring event handling

Event handling in spring [ContextRefreshedEvent and ContextClosedEvent] | Spring event handling

Event handling in spring [ContextRefreshedEvent and ContextClosedEvent] | Spring event handling
pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0%20http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.ram.core</groupId>
    <artifactId>SpringDemo</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>SpringDemo</name>
    <url>http://maven.apache.org</url>

    <properties>
        <spring.version>5.0.2.RELEASE</spring.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>

        <!-- Spring 5 dependencies -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
    </dependencies>
</project>

Employee.java

package com.ram.model;

/**
 * Spring bean
 *
 */

public class Employee
{
    private String name;

    public void setName(String name)
    {
        this.name = name;
    }

    public void employeeDetails()
    {
        System.out.println("Employee Name =  " + name);
    }
}

ContextRefreshEventHandler.java

package com.ram.eventhandler;

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;

public class ContextRefreshEventHandler implements ApplicationListener<ContextRefreshedEvent>
{
    public void onApplicationEvent(ContextRefreshedEvent event)
    {
        System.out.println("ContextRefreshedEvent Received = "+ event);
    }
}

ContextCloseEventHandler.java

package com.ram.eventhandler;

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;

public class ContextCloseEventHandler implements ApplicationListener<ContextClosedEvent>
{

    public void onApplicationEvent(ContextClosedEvent event)
    {
        System.out.println("ContextClosedEvent Received = "+event);
    }

}

applicationContext.xml


<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">


    <bean id="employee" class="com.ram.model.Employee">
        <property name="name" value="Peter" />
    </bean>

    <bean id="contextRefreshEventHandler" class="com.ram.eventhandler.ContextRefreshEventHandler" />
    <bean id="contextCloseEventHandler" class="com.ram.eventhandler.ContextCloseEventHandler" />

</beans>

App.java

package com.ram.core;

import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.ram.model.Employee;

public class App
{
    public static void main(String[] args)
    {
        ConfigurableApplicationContext context = new ClassPathXmlApplicationContext(
                "applicationContext.xml");

        context.start();
        System.out.println("---------------------------------------");

        Employee employee = (Employee) context.getBean("employee");
        System.out.println(
                "Got employee object from the ApplicationContext(Spring Container)");
        employee.employeeDetails();
       
        context.refresh();

        System.out.println("---------------------------------------");
        context.close();
    }

}

Output

Aug 26, 2018 8:38:10 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@5a2e4553: startup date [Sun Aug 26 08:38:10 IST 2018]; root of context hierarchy
Aug 26, 2018 8:38:10 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
ContextRefreshedEvent Received = org.springframework.context.event.ContextRefreshedEvent[source=org.springframework.context.support.ClassPathXmlApplicationContext@5a2e4553: startup date [Sun Aug 26 08:38:10 IST 2018]; root of context hierarchy]
---------------------------------------
Got employee object from the ApplicationContext(Spring Container)
Employee Name =  Peter
Aug 26, 2018 8:38:11 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@5a2e4553: startup date [Sun Aug 26 08:38:11 IST 2018]; root of context hierarchy
Aug 26, 2018 8:38:11 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
ContextRefreshedEvent Received = org.springframework.context.event.ContextRefreshedEvent[source=org.springframework.context.support.ClassPathXmlApplicationContext@5a2e4553: startup date [Sun Aug 26 08:38:11 IST 2018]; root of context hierarchy]
---------------------------------------
ContextClosedEvent Received = org.springframework.context.event.ContextClosedEvent[source=org.springframework.context.support.ClassPathXmlApplicationContext@5a2e4553: startup date [Sun Aug 26 08:38:11 IST 2018]; root of context hierarchy]
Aug 26, 2018 8:38:11 AM org.springframework.context.support.AbstractApplicationContext doClose
INFO: Closing org.springframework.context.support.ClassPathXmlApplicationContext@5a2e4553: startup date [Sun Aug 26 08:38:11 IST 2018]; root of context hierarchy

Click the below link to download the code:
https://sites.google.com/site/ramj2eev2/java_basics/SpringDemo_Event%20Handling%20in%20Spring_Context_refresh_close.zip?attredirects=0&d=1

Github Link:
https://github.com/ramram43210/javaee/tree/master/Spring_2018/SpringDemo_Event%20Handling%20in%20Spring_Context_refresh_close

Bitbucket Link:
https://bitbucket.org/ramram43210/spring/src/02e04aa1b68a77d4f5a01ebf111e80370bd99ca8/Spring_2018/SpringDemo_Event%20Handling%20in%20Spring_Context_refresh_close/?at=master

See also:

  • All JavaEE Videos Playlist
  • All JavaEE Videos
  • All JAVA EE Links
  • Spring Tutorial
  • Servlets Tutorial
  • All Design Patterns Links
  • JDBC Tutorial
  • Java Collection Framework Tutorial
  • JAVA Tutorial
  • Kids Tutorial
  • No comments:

    Post a Comment

    Tutorials