Master Spring & Java Development!
Subscribe to Ram N Java for clean, beginner-friendly coding guides!
🔔 Subscribe to Ram N JavaOverview: ContextStartedEvent and ContextStoppedEvent in Spring
The Spring Framework provides built-in lifecycle management events via the ApplicationContext. Beyond context refresh and close events, Spring provides ContextStartedEvent and ContextStoppedEvent to control explicit lifecycle phases for components and background tasks.
In this guide, you will learn what these two lifecycle events represent, when they are triggered, and how to create custom listeners to handle them effectively.
Understanding ContextStartedEvent & ContextStoppedEvent
Unlike refresh events which fire automatically during bootstrap, start and stop events are tied to explicit lifecycle calls on ConfigurableApplicationContext:
-
ContextStartedEvent: Published when the
ApplicationContextis started using thestart()method onConfigurableApplicationContext. AllLifecyclebeans receive an explicit start signal, making it useful for starting background threads, pollers, or scheduled jobs. -
ContextStoppedEvent: Published when the
ApplicationContextis stopped using thestop()method onConfigurableApplicationContext. AllLifecyclebeans receive an explicit stop signal, making it ideal for pausing background tasks without destroying the context.
Step-by-Step Implementation
-
Create Event Listeners: Define listener classes implementing
ApplicationListener<ContextStartedEvent>andApplicationListener<ContextStoppedEvent>. -
Override onApplicationEvent: Implement the
onApplicationEvent(...)method in each listener to handle start and stop actions. -
Invoke start() and stop(): Call
context.start()andcontext.stop()on yourConfigurableApplicationContextinstance to trigger the events.
Recommended Next Videos from Ram N Java
- 👉 Spring Event Handling: ContextRefreshedEvent and ContextClosedEvent Explained | Spring Tutorial
- 👉 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
Click here to watch on Youtube:
https://www.youtube.com/watch?v=iI76k19IQsg&list=UUhwKlOVR041tngjerWxVccw
Click the below Image to Enlarge:
| Event handling in spring [ContextStartedEvent and ContextStoppedEvent] | Spring event handling |
| Event handling in spring [ContextStartedEvent and ContextStoppedEvent] | Spring event handling |
| Event handling in spring [ContextStartedEvent and ContextStoppedEvent] | Spring event handling |
| Event handling in spring [ContextStartedEvent and ContextStoppedEvent] | Spring event handling |
| Event handling in spring [ContextStartedEvent and ContextStoppedEvent] | 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>
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);
}
}
ContextStartEventHandler.java
package com.ram.eventhandler;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextStartedEvent;
public class ContextStartEventHandler implements ApplicationListener<ContextStartedEvent>
{
public void onApplicationEvent(ContextStartedEvent event)
{
System.out.println("ContextStartedEvent Received = "+ event);
}
}
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextStartedEvent;
public class ContextStartEventHandler implements ApplicationListener<ContextStartedEvent>
{
public void onApplicationEvent(ContextStartedEvent event)
{
System.out.println("ContextStartedEvent Received = "+ event);
}
}
ContextStopEventHandler.java
package com.ram.eventhandler;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextStoppedEvent;
public class ContextStopEventHandler implements ApplicationListener<ContextStoppedEvent>
{
public void onApplicationEvent(ContextStoppedEvent event)
{
System.out.println("ContextStoppedEvent Received = "+event);
}
}
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextStoppedEvent;
public class ContextStopEventHandler implements ApplicationListener<ContextStoppedEvent>
{
public void onApplicationEvent(ContextStoppedEvent event)
{
System.out.println("ContextStoppedEvent 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="contextStartEventHandler" class="com.ram.eventhandler.ContextStartEventHandler" />
<bean id="contextStopEventHandler" class="com.ram.eventhandler.ContextStopEventHandler" />
</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="contextStartEventHandler" class="com.ram.eventhandler.ContextStartEventHandler" />
<bean id="contextStopEventHandler" class="com.ram.eventhandler.ContextStopEventHandler" />
</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();
System.out.println("---------------------------------------");
context.stop();
}
}
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();
System.out.println("---------------------------------------");
context.stop();
}
}
Output
Aug 25, 2018 10:35:16 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@610694f1: startup date [Sat Aug 25 10:35:16 IST 2018]; root of context hierarchy
Aug 25, 2018 10:35:16 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
ContextStartedEvent Received = org.springframework.context.event.ContextStartedEvent[source=org.springframework.context.support.ClassPathXmlApplicationContext@610694f1: startup date [Sat Aug 25 10:35:16 IST 2018]; root of context hierarchy]
---------------------------------------
Got employee object from the ApplicationContext(Spring Container)
Employee Name = Peter
---------------------------------------
ContextStoppedEvent Received = org.springframework.context.event.ContextStoppedEvent[source=org.springframework.context.support.ClassPathXmlApplicationContext@610694f1: startup date [Sat Aug 25 10:35:16 IST 2018]; root of context hierarchy]
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@610694f1: startup date [Sat Aug 25 10:35:16 IST 2018]; root of context hierarchy
Aug 25, 2018 10:35:16 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
ContextStartedEvent Received = org.springframework.context.event.ContextStartedEvent[source=org.springframework.context.support.ClassPathXmlApplicationContext@610694f1: startup date [Sat Aug 25 10:35:16 IST 2018]; root of context hierarchy]
---------------------------------------
Got employee object from the ApplicationContext(Spring Container)
Employee Name = Peter
---------------------------------------
ContextStoppedEvent Received = org.springframework.context.event.ContextStoppedEvent[source=org.springframework.context.support.ClassPathXmlApplicationContext@610694f1: startup date [Sat Aug 25 10:35:16 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_start_stop.zip?attredirects=0&d=1
Github Link:
https://github.com/ramram43210/javaee/tree/master/Spring_2018/SpringDemo_Event%20Handling%20in%20Spring_Context_start_stop
Bitbucket Link:
https://bitbucket.org/ramram43210/spring/src/02e04aa1b68a77d4f5a01ebf111e80370bd99ca8/Spring_2018/SpringDemo_Event%20Handling%20in%20Spring_Context_start_stop/?at=master
See also:
No comments:
Post a Comment