参考:Spring事件监听流程分析【源码浅析】_private void processbean(final string beanname, fi-CSDN博客
一、简介
Spring早期通过实现ApplicationListener接口定义监听事件,Spring 4.2开始通过@EventListener注解实现监听事件
@FunctionalInterface
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
/**
* Handle an application event.
* @param event the event to respond to
*/
void onApplicationEvent(E event);
/**
* Create a new {@code ApplicationListener} for the given payload consumer.
* @param consumer the event payload consumer
* @param <T> the type of the event payload
* @return a corresponding {@code ApplicationListener} instance
* @since 5.3
* @see PayloadApplicationEvent
*/
static <T> ApplicationListener<PayloadApplicationEvent<T>> forPayload(Consumer<T> consumer) {
return event -> consumer.accept(event.getPayload());
}
}
二、示例
(1)、自定义事件,相当于抽象观察者
/*
* 系统日志事件,观察者
* */
public class SysLogEvent extends ApplicationEvent {
public SysLogEvent(SysLog sysLog){
super(sysLog);
}
}
(2)、自定义实现,相当于具体观察者
@Component
public class SysLogListener implements ApplicationListener<SysLogEvent> {
private final static Logger logger = LoggerFactory.getLogger(SysLogListener.class);
@Override
public void onApplicationEvent(SysLogEvent event) {
logger.info("收到调用日志消息:"+ JSON.toJSONString(event));
}
/*
* spring 4.2版本用@EventListener注解
* */
// @EventListener(SysLogEvent.class)
public void saveSysLog(SysLog event){
logger.info("收到调用日志消息:"+ JSON.toJSON(event));
}
}
(3)、发布订阅事件
@RestController
@RequestMapping("/event")
public class EventController {
@Autowired
private ApplicationContext applicationContext;
@RequestMapping("public")
public void event(){
SysLog sysLog = new SysLog();
sysLog.setLogId("1");
sysLog.setCode("2");
sysLog.setMessage("3");
applicationContext.publishEvent(new SysLogEvent(sysLog));
}
}
(4)、测试