栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot项目实现事件的监听

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot项目实现事件的监听

文章目录
      • 场景
      • 解决
      • 涉及到的技术点
        • 事件监听的实现方式
          • ApplicationContext.publishEvent 源码分析

场景
  • 微服务在项目启动的时候 需要将自身的一些信息(比如:ip port)注册到管理项目中,方便管理者做请求分发, 那么这就需要捕捉到项目启动事件,项目关闭事件 已完成项目的注册,以及删除; 虽然注册中心可以完成这种功能,但是注册中心做不到精细化的控制。
解决
  1. 项目启动事件捕捉

可以依赖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();
        }
    }
}

  1. 项目关闭事件捕捉

可以依赖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.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;
    }
}
  1. 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());
    }
}
  1. 事件的发布
    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 源码分析
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/868141.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号