只要是事件就是观察者模式,Spring中的Event也不例外,主要应用就是程序解耦,实现本质是广播的形式........屁话不多说
2 Spring的event实现方式:继承ApplicationEvent即可,但是Spring版本4.2之后不再强制要求继承ApplicationEvent,非Application的子类将被封装成PayloadApplicationEvent:
实现:
import org.springframework.context.ApplicationEvent;
public class MyEvent extends ApplicationEvent {
//todo -----
private String msg;
public MyEvent(Object source) {
super(source);
}
public MyEvent(Object source,String msg) {
super(source);
this.msg=msg;
}
public String getMsg() {
return msg;
}
}
3 事件的推送:
编写事件推送的service实现ApplicationContextAwar接口,或者实现ApplicationEventPublisherAware接口,在需要时候根据业务场景推送事件:
实现:
@Service
public class EventProduceService implements ApplicationContextAware, ApplicationEventPublisherAware {
//实现方式一
private ApplicationContext applicationContext;
//实现方式二
private ApplicationEventPublisher applicationEventPublisher;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher=applicationEventPublisher;
}
public void sentEvent(){
//方式一:applicationContext的推送Api可以以根据需要进行选择
applicationContext.publishEvent(new MyEvent(this,"我是一颗小码农"));
//方式二: applicationEventPublisher的推送Api可以以根据需要进行选择
applicationEventPublisher.publishEvent(new MyEvent(this,"今天是20220804"));
}
}
4事件监听器(处理器):
编写事件的处理器,交给Spring的ioc管理即可,实现有两种方式,
(1)通过@EventListener注解标注对应的事件处理器,处理器会根据参数类型自动识别事件类型的
实现:
@Configuration
public class EventConfig {
@EventListener
public void doWithEvent(MyEvent myEvent) {
System.out.println("事件消息是: "+myEvent.getMsg());
}
@EventListener
public void doWithEvent(BEvent myEvent) {
System.out.println("事件消息是: "+myEvent.getMsg());
}
@EventListener
public void doWithEvent(CEvent myEvent) {
System.out.println("事件消息是: "+myEvent.getMsg());
}
}
(2) 实现ApplicationListener
实现
@Component public class EventHandler implements ApplicationListener5 异步事件:{ @Override public void onApplicationEvent(MyEvent event) { //todo---- System.out.println(event.getMsg()); } }
Spring默认监控的事件都是同步的,实现异步事件就需要开启异步事件的支持,配置类上使用@EventListener注解开启异步支持,然后在监听器上使用@Async注解标注即可,同一个事件多个处理器可以使用@Order注解进行排序(参数越小优先级越高)
实现:
@Configuration
@EnableAsync
public class EventConfig {
@Async
@EventListener
public void doWithEvent(MyEvent myEvent) {
System.out.println("事件消息是: "+myEvent.getMsg());
}
}
@Async//配置类已经开启异步支持
@Component
public class EventHandler implements ApplicationListener {
@Override
public void onApplicationEvent(MyEvent event) {
//todo----
System.out.println(event.getMsg());
}
}
6 事件异常处理器
//todo......改天补上,困困困.....
7 事件观察者模式://todo------



