spring面向事件编程

本文介绍了如何在Spring框架中使用事件驱动模型,包括创建自定义事件、事件发布者和事件监听器。通过示例展示了如何利用ApplicationContextAware接口发布事件,以及使用@EventListener注解绑定事件处理方法。
摘要由CSDN通过智能技术生成

spring面向事件编程

谈到Spring 事件驱动模型,我想大家都不陌生,事件驱动模型,通常也可以说是观察者设计模式,对观察者设计模式不熟悉的朋友可以看我之前写的笔记,设计模式java语言实现之观察者模式,在java事件驱动的支持中,EventBus做移动端开发的朋友应该都比较了解,其实,java本身也自带了对事件驱动的支持,但是大部分都是用于我们的客户端开发,比如GUI ,Swing这些,而Spring 则在java的基础上,扩展了对事件驱动的支持。

代码实战

首先,我们新建一个类NotifyEvent 继承ApplicationEvent,用于封装我们事件额外的信息,这里则是String类型的msg,用于记录详细的事件内容。

public class NotifyEvent extends ApplicationEvent {

    private String msg;

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

    public String getMsg() {
        return msg;
    }
}

其中,ApplicationEvent 是一个抽象类,扩展了java本身的EventObject 类,每一个继承了ApplicationEvent的子类都表示一类事件,可以携带数据。

然后新建一个NotifyPublisher用于我们事件的发布工作,该类实现了ApplicationContextAware并重写了setApplicationContext 方法,这一步的目的是可以获取我们Spring的应用上下文,因为事件的发布是需要应用上下文来做的

@Component //声明成组件,为了后期注入方便
public class NotifyPublisher implements ApplicationContextAware {

    private ApplicationContext ctx; //应用上下文

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.ctx= applicationContext;
    }

    // 发布一个消息,这里大家可以根据不同的状态实现发布不同的事件,我这里就只写了一个事件类,所以if else
    //都发布NotifyEvent事件。
    public void publishEvent(int status, String msg) {
        if (status == 0) {
            ctx.publishEvent(new NotifyEvent(this, msg));
        } else {
            ctx.publishEvent(new NotifyEvent(this,msg)) ;
        }
    }
}

最后一步就是实现一个类作为事件的订阅者啦,当事件发布时,会通知订阅者,然后订阅者做相关的处理,比如新用户注册发送事件自动发送欢迎邮件等等。同时,Spring 4.2 版本更新的EventListener,可以很方便帮助我们实现事件与方法的绑定,只需要在目标方法上加上EventListener即可。

@Component
public class NotifyListener {

    @EventListener
    //参数NotifyEvent ,当有NotifyEvent 类型的事件发生时,交给sayHello方法处理
    public void sayHello(NotifyEvent notifyEvent){
       System.out.println("收到事件:"+notifyEvent.getMsg());
    }

}

测试:编写我们的测试类TestController。

@RestController
public class TestController {

    @Autowired
    private NotifyPublisher notifyPublisher;

    @GetMapping("/sayHello")
    public String sayHello(){
        notifyPublisher.publishEvent(1, "我发布了一个事件");
        return "Hello Word";

    }

}

启动我们的应用,在浏览器中输入http://127.0.0.1:8080/sayHello,控制台输出:
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值