Subject)”,当其状态发生变化时(比如播放新的内容),会通知所有的观察者。想象我们正在听广播,广播电台就是一个事件源,它提供了大量的新闻、音乐和其他内容。继承ApplicationEvent,定义刷新事件
public class RefreshEvent extends ApplicationEvent {
private Object event;
private String eventDesc;
public RefreshEvent(Object source, Object event, String eventDesc) {
super(source);
this.event = event;
this.eventDesc = eventDesc;
}
public Object getEvent() {
return this.event;
}
public String getEventDesc() {
return this.eventDesc;
}
}
方式一:直接注入ApplicationContext
@Autowired
private ApplicationContext applicationContext;
applicationContext.publishEvent();
方式二:直接注入ApplicationEventPublisher
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
applicationEventPublisher.publishEvent(myEvent)
方式三:实现ApplicationEventPublisherAware注解
// 事件发布者
@Component
public class CustomEventPublisher implements ApplicationEventPublisherAware {
private ApplicationEventPublisher applicationEventPublisher;
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
}
public void publishEvent(RefreshEvent envent) {
CustomEvent customEvent = new CustomEvent(this, message); // 发布者作为事件来源
applicationEventPublisher.publishEvent(envent);
}
}
方式一:继承ApplicationListener或者其子类
public class RefreshEventListener implements SmartApplicationListener {
private ContextRefresher refresh;
/**
* 处理刷新事件
*/
@Override
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ApplicationReadyEvent) {
handle((ApplicationReadyEvent) event);
}
else if (event instanceof RefreshEvent) {
handle((RefreshEvent) event);
}
}
/**
* 调用ContextRefresher类的刷新方法
*/
public void handle(RefreshEvent event) {
if (this.ready.get()) { // don't handle events before app is ready
log.debug("Event received " + event.getEventDesc());
Set<String> keys = this.refresh.refresh();
log.info("Refresh keys changed: " + keys);
}
}
}
方式二:使用@EventListener注解指定要监听的事件
// 事件监听器
@Component
public class CustomEventListener {
@EventListener(CustomEvent.class)
public void handleCustomEvent(CustomEvent event) {
System.out.println("Received custom event - " + event.getMessage());
}
}