- 场景
- 解决
- 涉及到的技术点
- 事件监听的实现方式
- ApplicationContext.publishEvent 源码分析
- 微服务在项目启动的时候 需要将自身的一些信息(比如:ip port)注册到管理项目中,方便管理者做请求分发, 那么这就需要捕捉到项目启动事件,项目关闭事件 已完成项目的注册,以及删除; 虽然注册中心可以完成这种功能,但是注册中心做不到精细化的控制。
- 项目启动事件捕捉
可以依赖ApplicationReadyEvent事件, 下面是测试代码
@Slf4j @Component public class ApplicationReadyEventListener implements ApplicationListener{ @Override public void onApplicationEvent(ApplicationReadyEvent event) { try { String hostAddress = InetAddress.getLocalHost().getHostAddress(); log.info("ApplicationReadyEvent事件捕捉(应用已准备好) IP:{}", hostAddress ); } catch (UnknownHostException e) { e.printStackTrace(); } } }
- 项目关闭事件捕捉
可以依赖DisposableBean, 将自身注册为bean,自身被销毁的时候 会调用destroy方法
@Component
@Slf4j
public class ApplicationClosedEventListener implements DisposableBean, InitializingBean {
@Override
public void destroy() throws Exception {
log.info("项目关闭事件");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("ApplicationClosedEventListener bean被初始化之后");
}
}
涉及到的技术点
事件监听的实现方式
- 事件分类
1.1 spring自身的事件
1.2 自定义事件
这种可以通过继承ApplicationEvent实现, eg:
@Getter
public class SleepEvent extends ApplicationEvent {
private String user;
public SleepEvent(Object source) {
super(source);
}
public SleepEvent(Object source, String user) {
super(source);
this.user = user;
}
}
- springboot项目实现监听,有两种方式,这两种方式都需把监听器交给容器管理 @Component
2.1 通过ApplicationListener接口实现, eg:
@Component @Slf4j public class SleepInterfaceListener implements ApplicationListener{ @Override public void onApplicationEvent(SleepEvent event) { log.info("{} is sleeping! ApplicationListener接口实现", event.getUser() ); } }
2.2 通过@EventListener注解实现, @EventListener的value属性设置成监听事件 如下:
@Component
@Slf4j
public class SleepAnnoListener {
@EventListener(SleepEvent.class)
public void onEvent(SleepEvent event){
log.info("{} is sleeping! @EventListener注解实现", event.getUser());
}
}
- 事件的发布
3.1 通过ApplicationContext.publishEvent方法实现
@GetMapping("/sleepEvent")
@ApiOperation(value = "通过ApplicationListener接口,@EventListener注解实现SleepEvent事件", httpMethod = "GET", response = R.class)
public R implementInterface() {
SpringUtils.getApplicationContext().publishEvent(new SleepEvent(this,"carsonlius"));
return R.success("成功的通过通过ApplicationListener接口实现了事件的监听");
}
ApplicationContext.publishEvent 源码分析


