目录
概念
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岁。