Spring 事件监听

本文将介绍 Spring 中的事件监听机制。

一、事件监听机制

事件监听机制的本质是观察者模式。

事件发布者可以声明某个事件的发生,它将会被广播出去,监听该事件的监听器将会被触发并执行相应的动作。

通过事件监听机制可以极大地降低代码的耦合性,在事件发布和监听模型中,

  • 事件发布者只需要将事件发布,无需关心是否有事件监听器
  • 事件监听器无需关心是谁发布了事件,只需要监听事件并执行逻辑即可

二、示例

定义事件类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class MsgEvent extends ApplicationEvent {

private String msg;

public String getMsg() {
return msg;
}

public MsgEvent(Object source) {
super(source);
}

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

}

定义事件发布者:

1
2
3
4
5
6
7
8
9
@Component
public class MsgEventPublisher {

public void publish(String msg) {
MsgEvent event = new MsgEvent(this, msg);
SpringContextHolder.getApplicationContext().publishEvent(event);
}

}

定义 Spring 上下文获取工具类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Component
public class SpringContextHolder implements ApplicationContextAware {

private static ApplicationContext applicationContext;

public static ApplicationContext getApplicationContext() {
return applicationContext;
}

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

}

定义事件监听器:

1
2
3
4
5
6
7
8
9
@Component
public class MsgEventListener implements ApplicationListener<MsgEvent> {

@Override
public void onApplicationEvent(MsgEvent event) {
System.out.println("MsgEventListener: " + event.getSource() + ": " + event.getMsg());
}

}

参考