Master Spring & Java Development!
Subscribe to Ram N Java for clean, beginner-friendly coding guides!
🔔 Subscribe to Ram N JavaOverview: Custom Event Handling in Spring
The Spring Framework provides robust built-in support for event-driven architecture through its ApplicationContext event handling mechanism. While Spring comes with standard events (like ContextRefreshedEvent and ContextClosedEvent), you can also create and publish your own custom events to decouple components across your application.
In this guide, you will learn how to build, publish, and listen for custom events in Spring applications.
Core Components of Spring Event Handling
Custom event handling in Spring revolves around three essential elements:
-
Custom Event Class: Extends
ApplicationEventto encapsulate the event data or message payload. -
Event Publisher: Uses
ApplicationEventPublisher(or implementsApplicationEventPublisherAware) to fire the event to all registered listeners. -
Event Listener: Implements
ApplicationListener<CustomEvent>to handle and process the event when it is triggered.
Step-by-Step Implementation
-
Create the Custom Event: Define a class extending
ApplicationEventand pass the source object to the super constructor. -
Publish the Event: Inject
ApplicationEventPublisherinto your publisher service and invokepublishEvent(new CustomEvent(this)). -
Handle the Event: Implement the
onApplicationEvent(CustomEvent event)method in your listener bean to execute the required action asynchronously or synchronously.
Recommended Next Videos from Ram N Java
Click here to watch on Youtube:
https://www.youtube.com/watch?v=w0N2zbyLwSM&list=UUhwKlOVR041tngjerWxVccw
Click the below Image to Enlarge:
| Custom Events in Spring | Spring Custom Events | Spring event handling |
| Custom Events in Spring | Spring Custom Events | Spring event handling |
| Custom Events in Spring | Spring Custom Events | 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>
CustomEvent.java
package com.ram.events;
import org.springframework.context.ApplicationEvent;
public class CustomEvent extends ApplicationEvent
{
public CustomEvent(Object source)
{
super(source);
}
public String toString()
{
return "My Custom Event";
}
}
import org.springframework.context.ApplicationEvent;
public class CustomEvent extends ApplicationEvent
{
public CustomEvent(Object source)
{
super(source);
}
public String toString()
{
return "My Custom Event";
}
}
CustomEventPublisher.java
package com.ram.eventpublisher;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import com.ram.events.CustomEvent;
public class CustomEventPublisher implements ApplicationEventPublisherAware
{
private ApplicationEventPublisher publisher;
public void setApplicationEventPublisher(
ApplicationEventPublisher publisher)
{
this.publisher = publisher;
}
public void publish()
{
CustomEvent customEvent = new CustomEvent(this);
publisher.publishEvent(customEvent);
}
}
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import com.ram.events.CustomEvent;
public class CustomEventPublisher implements ApplicationEventPublisherAware
{
private ApplicationEventPublisher publisher;
public void setApplicationEventPublisher(
ApplicationEventPublisher publisher)
{
this.publisher = publisher;
}
public void publish()
{
CustomEvent customEvent = new CustomEvent(this);
publisher.publishEvent(customEvent);
}
}
CustomEventHandler.java
package com.ram.eventhand
ler;
import org.springframework.context.ApplicationListener;
import com.ram.events.CustomEvent;
public class CustomEventHandler implements ApplicationListener<CustomEvent>
{
public void onApplicationEvent(CustomEvent event)
{
System.out.println("Received custom event = "+event.toString());
}
}
ler;
import org.springframework.context.ApplicationListener;
import com.ram.events.CustomEvent;
public class CustomEventHandler implements ApplicationListener<CustomEvent>
{
public void onApplicationEvent(CustomEvent event)
{
System.out.println("Received custom event = "+event.toString());
}
}
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="customEventHandler" class=" com.ram.eventhandler.CustomEventHandler" />
<bean id="customEventPublisher" class="com.ram.eventpublisher.CustomEventPublisher" />
</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="customEventHandler" class=" com.ram.eventhandler.CustomEventHandler" />
<bean id="customEventPublisher" class="com.ram.eventpublisher.CustomEventPublisher" />
</beans>
App.java
package com.ram.core;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.ram.eventpublisher.CustomEventPublisher;
public class App
{
public static void main(String[] args)
{
ConfigurableApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");
CustomEventPublisher customEventPublisher = (CustomEventPublisher) context
.getBean("customEventPublisher");
customEventPublisher.publish();
customEventPublisher.publish();
}
}
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.ram.eventpublisher.CustomEventPublisher;
public class App
{
public static void main(String[] args)
{
ConfigurableApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");
CustomEventPublisher customEventPublisher = (CustomEventPublisher) context
.getBean("customEventPublisher");
customEventPublisher.publish();
customEventPublisher.publish();
}
}
Output
Aug 28, 2018 10:28:25 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@610694f1: startup date [Tue Aug 28 10:28:25 IST 2018]; root of context hierarchy
Aug 28, 2018 10:28:25 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
Received custom event = My Custom Event
Received custom event = My Custom Event
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@610694f1: startup date [Tue Aug 28 10:28:25 IST 2018]; root of context hierarchy
Aug 28, 2018 10:28:25 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
Received custom event = My Custom Event
Received custom event = My Custom Event
Click the below link to download the code:
https://sites.google.com/site/ramj2eev2/java_basics/SpringDemo_Custom_Events.zip?attredirects=0&d=1
Github Link:
https://github.com/ramram43210/javaee/tree/master/Spring_2018/SpringDemo_Custom_Events
Bitbucket Link:
https://bitbucket.org/ramram43210/spring/src/02e04aa1b68a77d4f5a01ebf111e80370bd99ca8/Spring_2018/SpringDemo_Custom_Events/?at=master
See also:
No comments:
Post a Comment