Spring事件机制
Spring中的事件机制是一个观察者模式的实现.观察者模式就是一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知.Spring的事件由ApplicationContext发布。
Spring中的默认事件
ContextStartedEvent: ApplicationContext启动后触发的事件
ContextStoppedEvent: ApplicationContext停止后触发的事件
ContextRefreshedEvent:ApplicationContext初始化或刷新完成后触发的事件
ContextClosedEvent: ApplicationContext关闭后触发的事件
· 在tomcat中ContextRefreshedEvent
可能会触发两次,SpringBoot中只触发一次
Spring中的事件监听者
·ApplicationListener
spring中的事件监听者
Spring中事件的载体
·ApplicationEvent
是Spring中的事件载体
一个简单的监听器的实现
public class ApplicationRefreshEventListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
// todo something
}
}
一个自定义的事件实现
public class CustomEvent extends ApplicationEvent {
public CustomEvent(Object source) {
super(source);
}
}
一个自定义事件的监听
public class CustomEventListenner implements ApplicationListener<CustomEvent> {
@Override
public void onApplicationEvent(CustomEvent customEvent) {
}
}
发出一个事件
public class ApplcationEventsPublish {
private ApplicationContext applicationContext;
public void sendEmail(String email) {
applicationContext.publishEvent(new CustomEvent(new Object()));
}
}
解耦的思想
前面介绍了那么多,下面介绍如何进行解耦与高性能。
一个典型的场景就是用户在注册的时候需要发送验证码,这时就需要将发送验证码的逻辑写到用户注册的业务逻辑中,如果短信发送的API发生变化后,就需要对用户注册的代码段进行修改,实际上这部分修改跟用户注册没什么关系,修改结果之后需要对用户注册也需要进行测试,如果对发送验证码定义成事件,在有变化之后只需要修改对应事件监听,或添加时间监听,对原来的代码没有入侵。
高性能的实现,在事件的监听器中可以采用多线程的方式,这样的方式在正常的业务逻辑中是无法采用的。