Tuesday, 25 September 2018

Custom Events in Spring | Spring Custom Events | Spring event handling

Master Spring & Java Development!

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

🔔 Subscribe to Ram N Java

Overview: 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 ApplicationEvent to encapsulate the event data or message payload.
  • Event Publisher: Uses ApplicationEventPublisher (or implements ApplicationEventPublisherAware) 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

  1. Create the Custom Event: Define a class extending ApplicationEvent and pass the source object to the super constructor.
  2. Publish the Event: Inject ApplicationEventPublisher into your publisher service and invoke publishEvent(new CustomEvent(this)).
  3. 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>

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";
    }
}


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);
    }
}


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());
    }
}


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>

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();
    }

}

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

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:

  • 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
  • Cooking Tutorial
  • No comments:

    Post a Comment

    Tutorials