目录
- 1.基础
- 2.IOC基于xml的配置
- 3.IOC基于注解的配置
- 4.AOP的相关概念
- 6.spring进阶
- 7.消息监听机制
- 8.事物控制与传播行为
- 9.Spring源码
- 10.spring的生命周期
消息事件是spring重要的功能,主要的作用是,一个地方发出通知,其他地方那个能够进行相应代码的执行。
1.相关的概念:
(一)消息:在spring中用来完成信息传递的载体,任何实现了ApplicationEvent接口的类都可以作为消息
(二)消息的发布者:spring的事件发布者将我们的消息发布,调用AppliacionPublisher的publishEvent方法将消息发布
(三)消息的监听者:spring消息的接受者,接收到消息后完成相关的操作
2.实际应用
消息:
//实现了ApplicationEvent方法,重写其构造函数
public class MyEvent1 extends ApplicationEvent {
private String message;
public MyEvent1(Object source,String message) {
super(source);
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
发布者:
//调用applicationEventPublisher中的publisher方法,将消息发布
class PublishEvent {
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
public void getEvent() {
System.out.println("----发布1开始-------");
MyEvent1 event = new MyEvent1(this, "新消息1");
applicationEventPublisher.publishEvent(event);//发布者发布消息
System.out.println("----发布1完成-------");
}
}
监听者:
//实现了ApplicationListener接口,实现onApplicationEvent方法,并注册至spring容器
@Component
public class Listener1 implements ApplicationListener<MyEvent1> {
@Override
public void onApplicationEvent(MyEvent1 event) {
System.out.println("Listener1 收到事件通知:" + event.getMessage());
//do something
}
}
3.使用@EventListener注解
在监听者的方法上使用@EventListener注解,相当于该方法实现了ApplicationListener接口,并且一个监听者可以拥有多个@EventListener,完成对多个消息的监听
/**
* 学生监听多种事件,并作出响应
*/
@Component
public class Student {
/**
* 监听上课铃声
* @param event1
*/
@EventListener
public void listenSchoolBell(MyEvent1 event1) {
System.out.println("上课铃响了,我要去上课...");
//do something
}
/**
* 监听老师提问
* @param event2
*/
@EventListener
public void listenTeacherAskMe(MyEvent1 event2) {
System.out.println("老师提问了,我要起立回答问题...");
//do something
}
}
4.异步监听
在spring中消息的监听默认是按照循环方式执行的,如果一个消息监听者出现异常,则后续的消息发布会阻塞,因此我们可以利用异步消息监听,每个监听者接收到消息之后,会创造一个新的线程来处理该消息事件,这样可以避免消息监听者异常带来的阻塞问题
使用方法: (一)在配置类上使用@EnableAsync注解,表明该项目中开启异步方法
(二)在监听者需要采用异步监听的方法上采用@Async注解
//开启异步处理方式
@EnableAsync
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Component
public class Listener4 {
//在监听方法上使用@Async注解
@Async
@EventListener
public void listenerMyEvent1(MyEvent1 event) {
System.out.println("Listener4 收到事件通知:" + event.getMessage());
}
}