Spring 事件
事件体系使用了观察者模式。在Spring容器中也内置了一些常用的事件,比如IOC容器刷新开始、结束、关闭等事件。
Spring事件体系三个组件:
事件(ApplicationEvent)
:可以对应为观察者模式中的被观察者
监听器(ApplicationListener)
:可以对应为观察者模式中的观察者。监听器监听特定事件,并在内部定义了事件发生后的响应逻辑。
事件发布器(ApplicationEventMulticaster )
:可以对应为观察者模式中的被观察者/主题,负责通知观察者对外提供发布事件,维护事件和事件监听器之间的映射关系,并在事件发生时负责通知相关监听器。
事件:
自定义事件只需要继承ApplicationEvent:
public class EventTest extends ApplicationEvent {
private String name;
public EventTest(Object source, String name) {
super(source);
this.name = name;
}
public String getName() {
return name;
}
}
事件监听器:
事件监听器有两种,一种是基于接口的,一种是基于注解的。Spring注册事件监听器也是发生在IOC容器初始化阶段。
基于接口:
实现ApplicationListener接口,这是个泛型接口,泛型类类型就是事件类型,其次需要是spring容器托管的bean,所以加了@component,需要重写onApplicationEvent方法。
@Component
public class EventListenerTest implements ApplicationListener<OrderEvent> {
@Override
public void onApplicationEvent(OrderEvent event) {
if(event.getName().equals("扣减库存")){
System.out.println("库存-1");
}
}
}
基于注解:
@Component
public class EventListenerTest {
//修饰在方法上,参数为事件类型
@EventListener(OrderEvent.class)
public void onApplicationEvent(OrderEvent event) {
if(event.getName().equals("扣减库存")){
System.out.println("库存-1");
}
}
}
事件发布器:
实现ApplicationEventPublisher接口,重写publishEvent()方法,可以自定义事件发布逻辑。
@Component
public class EventPublisherTest implements ApplicationEventPublisher {
@Override
public void publishEvent(Object event) {
System.out.println("事件发布...");
}
}