spring event (@EventListener)

本文介绍了一个基于Spring框架的事件发布与监听的实现案例,详细展示了如何定义事件、事件监听器和事件发布者,并通过RESTful API触发事件,实现异步处理和邮件通知的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.hhwy;

import org.springframework.context.ApplicationEvent;

public class DemoEvent extends ApplicationEvent{

    private String msg;

    private String email;

    public DemoEvent(Object source,String msg,String email) {
        super(source);
        this.msg=msg;
        this.email=email;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

}
package com.hhwy.fm.projectmonthlyreport;

import com.hhwy.DemoEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

/**
 * <br>描 述:
 * <br>创 建 人:jzq
 * <br>创建时间:2019/6/3 19:48
 * <br>修改备注:无
 * <br>版本:1.0.0
 */
@Component
public class DemoEventListener implements ApplicationListener<DemoEvent> {

    //使用注解@Async支持 这样不仅可以支持通过调用,也支持异步调用,非常的灵活,
    @Async
    @Override
    public void onApplicationEvent(DemoEvent event) {
        System.out.println("注册成功,发送确认邮件为:" + event.getEmail()+",消息摘要为:"+event.getMsg());
    }

}
package com.hhwy.fm.projectmonthlyreport;

import com.hhwy.DemoEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

/**
 * <br>描 述:
 * <br>创 建 人:jzq
 * <br>创建时间:2019/6/3 19:52
 * <br>修改备注:无
 * <br>版本:1.0.0
 */
@Component
public class DemoEventPublisher {

    @Autowired
    private ApplicationContext applicationContext;

    public void pushlish(String msg,String mail){
        applicationContext.publishEvent(new DemoEvent(this, msg,mail));
    }

}
package com.hhwy.fm.projectmonthlyreport.controller;

import com.hhwy.fm.projectmonthlyreport.DemoEventPublisher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * <br>描 述:检测-保函管理
 * <br>创 建 人:Jinzhaoqiang
 * <br>创建时间:19.5.17 
 * <br>修改备注:无
 * <br>版本:1.0.0
 */
@RestController
@RequestMapping("/test")
public class Test {

   @Autowired
   private DemoEventPublisher demoEventPublisher;
 
   @RequestMapping(value = "/test", method = RequestMethod.GET)
   public void test() {
      demoEventPublisher.pushlish("张三1","565792147@qq.com");
      demoEventPublisher.pushlish("张三2","565792147@qq.com"); 
   }
}

转载于:https://my.oschina.net/u/2351011/blog/3057903

### Spring 中 `@EventListener` 注解的使用方法 #### 基本概念 `@EventListener` 是 Spring 提供的一个注解,允许开发者监听并响应特定类型的事件。该注解可以应用于任何带有参数的方法上,这些参数代表要监听的事件类型。 当应用程序上下文中发生指定类型的事件时,Spring 将自动调用被此注解标记的方法,并传递相应的事件对象作为参数[^2]。 #### 定义简单的事件处理器 为了定义一个能够处理自定义事件的组件,可以通过如下方式: ```java @Component public class MyEventHandler { @EventListener public void handleCustomEvent(CustomEvent customEvent) { System.out.println("Received Custom Event: " + customEvent); } } ``` 在这个例子中,每当有 `CustomEvent` 类型的事件被触发时,`handleCustomEvent()` 方法就会被执行[^4]。 #### 处理多种类型的事件 如果希望同一个方法能处理多个不同种类的事件,则可以在 `@EventListener` 上提供一个类数组: ```java @EventListener({MyEvent.class, AnotherEvent.class}) public void multiTypeHandler(ApplicationEvent event){ // Handle multiple types of events here. } ``` 这使得单个方法可以根据传入的具体事件实例执行不同的业务逻辑。 #### 异步事件处理 对于耗时较长的任务或者不希望阻塞主线程的情况,还可以通过组合使用 `@Async` `@EventListener` 实现异步事件处理机制: ```java @Component public class AsyncExceptionHandler { @Async @EventListener public void asyncHandleError(SimpleEvent event) throws Exception { if ("error".equals(event.getMessage())) { throw new RuntimeException("Simulated runtime exception"); } } } ``` 需要注意的是,在启用异步支持之前,需确保配置文件中有对应的设置以开启异步功能[^5]。 #### 创建发布事件 除了编写监听器外,还需要有一个地方去创建并广播这些事件。通常情况下会借助于 `ApplicationContext` 的 `publishEvent()` 方法完成这一操作: ```java @Service public class UserService { private final ApplicationContext context; @Autowired public UserService(ApplicationContext context) { this.context = context; } public void createUser(User user) { // 用户注册逻辑... // 发送新用户已创建的通知给其他服务/模块 context.publishEvent(new UserCreatedEvent(user)); } } ``` 上述代码展示了如何在一个服务层内部创建一个新的用户之后立即通知整个应用环境关于这个变化的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值