spring的事件机制onApplicationEvent(非注解)和@EventListener(注解)

目录

概念

1. 事件本身

2. 发布事件的对象

3. 接收事件的对象

3.1 使用onApplicationEvent方法

3.2 使用@EventListener注解

4. 验证结果


概念

spring的事件机制是A调用一个发布事件的方法,就能自动调用B监听这个事件的方法,所以这个过程有3个对象:
1. 事件本身,其实就是一个对象,这个对象对应的类要继承spring的ApplicationEvent,这样才能被spring识别。
2. 发布事件的对象,一般都是使用ApplicationContext的publishEvent方法来发布;
3. 接收(或者叫监听)事件的对象,使用onApplicationEvent方法或者使用@EventListener注解的方法;


由上我们可以知道,不管是使用注解还是非注解的方式,事件和发布事件的方式都是一样的,就是接收事件的方法不同,下面我们用例子看看怎么完成上面的3个对象:

1. 事件本身

对应3个对象中的第一个,对象的类需要实现spring的ApplicationEvent。
 

package test.event;

import org.springframework.context.ApplicationEvent;

public class EventTest extends ApplicationEvent {

    private final int age;

    public EventTest(Object source, int age) {
        super(source);
        this.age = age;
    }

    public int getAge() {
        return age;
    }
}

2. 发布事件的对象

对应3个对象的第二个,使用ApplicationContext的publishEvent方法。

package test.event;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class EventTestController {
    @Autowired
    private ApplicationContext applicationContext;

    @GetMapping("/pub-event")
    public void pub() {
        applicationContext.publishEvent(new EventTest(this, 4));
    }
}

3. 接收事件的对象

对应3个对象的第三个,使用onApplicationEvent方法或者使用@EventListener注解的方法。

3.1 使用onApplicationEvent方法

package test.event;

import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class EventTestListener implements ApplicationListener<EventTest> {
    @Override
    public void onApplicationEvent(EventTest event) {
        System.out.println("非注解中jfs今年" + event.getAge() + "岁。");
    }
}

我们能看到使用这种方式接收事件还是有点复杂的,需要实现ApplicationListener,需要在泛型中指定事件。那来看看注解怎么实现。

3.2 使用@EventListener注解

package test.event;

import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
public class EventTestListenerByAnnotation {
    @EventListener
    public void listener1(EventTest event) {
        System.out.println("注解中jfs今年" + event.getAge() + "岁。");
    }
}

4. 验证结果

代码就这么多了,接下来,启动项目,请求"/test/pub-event",能看到如下输出:

注解中jfs今年4岁。
非注解中jfs今年4岁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值