Spring的事件(ApplicationEvent)为Bean与Bean之间的消息通信提供了支持, 当一个Bean处理完任务之后,希望另外一个Bean知道并做相应的处理,这时我们需要让另外一个Bean监听当前Bean所发生的事件。
Spring的事件需要遵循如下流程:
(1) 自定义事件,继承ApplicationEvent
(2) 自定义事件监听器,实现ApplicationListener
(3) 使用容器发布事件
MyEvent.java
/**
* 自定义事件
*/
public class MyEvent extends ApplicationEvent {
private static final long serialVersionUID = 1L;
private String msg;
public MyEvent(Object source, String msg) {
super(source);
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
MyListener.java
/**
* 事件监听器
*/
@Component
public class MyListener implements ApplicationListener<MyEvent> {
/** 对消息进行接收并处理 */
@Override
public void onApplicationEvent(MyEvent event) {
String msg = event.getMsg();
System.out.println("我(bean-myListener)接收到了bean-demoPublisher发布的消息:" + msg);
}
}
Publisher.java
/**
* 事件发布类
*/
@Component
public class Publisher {
@Autowired
ApplicationContext applicationContext; // 注入ApplicationContext用来发布事件
public void publish(String msg){
applicationContext.publishEvent(new MyEvent(this, msg)); // 使用ApplicationContext的publishEvent方法来发布
}
}
EventConfig.java
/**
* 配置类
*/
@Configuration
@ComponentScan("com.netant.spring4")
public class EventConfig {
}
Main.java
public class Main {
/**
* Spring的事件(ApplicationEvent)为Bean与Bean之间的消息通信提供了支持,
* 当一个Bean处理完任务之后,希望另外一个Bean知道并做相应的处理,这时我们需要让另外一个Bean监听当前Bean所发生的事件。
*
* Spring的事件需要遵循如下流程:
*
* (1) 自定义事件,继承ApplicationEvent
* (2) 自定义事件监听器,实现ApplicationListener
* (3) 使用容器发布事件
*/
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(EventConfig.class);
Publisher publisher = ctx.getBean(Publisher.class);
publisher.publish("hello!");
ctx.close();
}
}
运行结果: