事件机制分为三步:
1. 自定义事件
2. 监听事件
3. 发布事件
Spring4.2版本之前:
1.自定义事件
注:自定义事件需要继承ApplicationEvent
import org.springframework.context.ApplicationEvent;
public class BlackListEvent extends ApplicationEvent {
//自定义事件
public BlackListEvent(Object source) {
super(source);
}
}
2.监听事件
注:监听需要继承ApplicationListener泛型指的是自定义事件,监视器要交给Spring管理并且实例化;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
public class BlackListNotifier implements ApplicationListener<BlackListEvent> {
@Override
public void onApplicationEvent(BlackListEvent blackListEvent) {
//事件处理业务可以写在这里
}
}
3.发布事件
/*在需要使用事件的地方注入:ApplicationEventPublisher调用publishEvent()方法;发布自定义事件需要实例 化 BlackListEvent blackListEvent =new BlackListEvent(userAuthRequestDTO.getUsername());*/
@Autowired
ApplicationEventPublisher applicationEventPublisher;
public UserAuthResponseDTO auth(UserAuthRequestDTO userAuthRequestDTO) throws Exception {
BlackListEvent blackListEvent =new BlackListEvent(userAuthRequestDTO.getUsername());
applicationEventPublisher.publishEvent(blackListEvent);
}
Spring4.2版本之后:
1.自定义事件
注:自定义事件需要继承ApplicationEvent
import org.springframework.context.ApplicationEvent;
public class BlackListEvent extends ApplicationEvent {
//自定义事件
public BlackListEvent(Object source) {
super(source);
}
}
2.监听事件
注:监听不需要继承ApplicationListener,使用注解@EventListener并且反射自定义事件
事件默认是同步的,需要异步添加@Async可以了
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
public class BlackListNotifier {
@EventListener(BlackListEvent.class)
//@Async
public void onApplicationEvent(BlackListEvent blackListEvent) {
//事件处理业务可以写在这里
}
}
3.发布事件
/*在需要使用事件的地方注入:ApplicationEventPublisher调用publishEvent()方法;发布自定义事件需要实例 化 BlackListEvent blackListEvent =new BlackListEvent(userAuthRequestDTO.getUsername());*/
@Autowired
ApplicationEventPublisher applicationEventPublisher;
public UserAuthResponseDTO auth(UserAuthRequestDTO userAuthRequestDTO) throws Exception {
BlackListEvent blackListEvent =new BlackListEvent(userAuthRequestDTO.getUsername());
applicationEventPublisher.publishEvent(blackListEvent);
}