Master Spring & Java Development!
Subscribe to Ram N Java for clean, beginner-friendly coding guides!
🔔 Subscribe to Ram N JavaOverview: 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
ApplicationContextis either initialized or refreshed (for example, usingrefresh()onConfigurableApplicationContext). All beans are instantiated, dependencies are injected, and the container is fully active. -
ContextClosedEvent: Published when the
ApplicationContextis closed (for example, usingclose()). All singleton beans are about to be destroyed, making it the ideal phase for resource teardown.
Handling Lifecycle Events
-
Implement ApplicationListener: Create listener classes implementing
ApplicationListener<ContextRefreshedEvent>andApplicationListener<ContextClosedEvent>. -
Override onApplicationEvent: Put your post-startup logic or cleanup code inside the respective
onApplicationEvent()callback method. - 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
- 👉 Implementing Custom Event Handling in Spring | Spring Custom Events Tutorial | Spring Event Handling
- 👉 How to do Dependency Injection using Spring Expression Language SpEL(Annotation) | Spring Tutorial
- 👉 How to do Dependency Injection using Spring Expression Language SpEL(XML) | Spring Tutorial
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 |
<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>
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);
}
}
/**
* 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);
}
}
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);
}
}
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();
}
}
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
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: