1.一个简单示例
内置事件监听示例
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(EventDemo_1.class);
context.addApplicationListener(new MyListener());
context.refresh();
context.start();
context.close();
}
static class MyListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
System.out.println("API监听器--上下文就绪事件"+event);
}
}
@EventListener(ContextRefreshedEvent.class)
public void onApplicationEvent(ContextRefreshedEvent event) {
System.out.println("注解监听器--上下文就绪事件"+event);
}
@EventListener({ContextRefreshedEvent.class, ContextStartedEvent.class})
public void onApplicationEvent2() {
System.out.println("注解监听器--上下文就绪事件 多个");
}
2. 自定义监听器实现
监听器实现
- 实现接口:ApplicationListener
- 利用注解:@EventListener
- 一个事件实现方法一个参数
- 多个事件实现方法不能有参数
监听器注册
- 基本接口(ConfigurableApplicationContext API)
context.addApplicationListener(监听器实例);
- 基于Spring Bean,将监听器注册为Spring的Bean
context.register(监听器实例)
3. 事件发布
- 通过 ApplicationEventPublisher
获取实例(依赖注入):- 实现接口:ApplicationEventPublisherAware
- @AutoWired 实例
- 通过 ApplicationEventMulticaster
获取实例:- 依赖注入
- 依赖查找
- 直接注入ApplicationContext 实例,其实现了ApplicationEventPublisher接口
- 执行顺序
ApplicationEventPublisher先与ApplicationContext
4. 层次性上下文事件发布传递
存在父容器的情况时,子将事件交由父来发布
5. 内建事件
- 已刷新事件->所有bean都已经准备好
- 已启动事件
- 已停止事件
- 已关闭事件
6. Payload事件
PayloadApplicationEvent可携带信息