前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Cloud 系列-事件监听

Spring Cloud 系列-事件监听

原创
作者头像
3号攻城狮
发布2018-07-08 17:22:22
9520
发布2018-07-08 17:22:22
举报

背景

最近在系统性的学习Spring Cloud方面的知识点。

强推一波:https://segmentfault.com/ls/1650000011386794

上面是大佬小马哥的教学视频。

今天的内容是学习完章节一后的课后总结

Spring的事件监听

Spring的事件监听是基于标准的观察者模式的,如果在ApplicationContext部署了一个实现了ApplicationListener的bean,那么当一个ApplicationEvent发布到ApplicationContext时,这个bean得到通知并作特定的处理。

两个思考点:

1.实现了ApplicationListener的bean如何部署到ApplicationContext

2.一个ApplicationEvent如何发布到ApplicationContext

事件发布与监听Demo

导入依赖

创建demo工程,导入依赖

image.png
image.png
代码语言:txt
复制
<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.RELEASE</version>
</parent>

<dependencies>
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter</artifactId>
     </dependency>
</dependencies>

MyEvent 自定义事件

代码语言:txt
复制
import org.springframework.context.ApplicationEvent;
public class MyEvent extends ApplicationEvent {
    /*
    * 可以传入任何的类型的参数,已供在监听器及他处使用
    * */
    public MyEvent(Object source) {
        super(source);
    }
}

简单的介绍查看一下ApplicationEvent源码以及Spring-boot中的实现

image.png
image.png
image.png
image.png

从图中我们可以看到我们经常使用的几个事件

代码语言:txt
复制
ApplicationPreparedEvent
ApplicationReadyEvent
ApplicationStartingEvent

MyListener自定义监听器

代码语言:txt
复制
import org.springframework.context.ApplicationListener;
public class MyListener implements ApplicationListener<MyEvent> {
    @Override
    public void onApplicationEvent(MyEvent myEvent) {
        System.out.println("监听事件 : "+myEvent.toString());
        System.out.println("监听事件参数 : "+myEvent.getSource().toString());
    }
}

MyTest 模拟应用启动

代码语言:txt
复制
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MyTest {
    public static void main(String[] args){
    AnnotationConfigApplicationContext context= new AnnotationConfigApplicationContext();
        //增加监听器
     context.addApplicationListener(new MyListener());
        //上下文启动
     context.refresh();
        //发布事件
     context.publishEvent(new MyEvent("hello world"));
    }
}

运行结果显示,事件正常发布与监听

image.png
image.png

实际工作中应用

方式一

代码语言:txt
复制
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(MyApplication.class);
        SpringApplication.run(MyApplication.class, args);
        //添加监听器
        application.addListeners(new MyListener());
        //获取应用上下文
        ConfigurableApplicationContext context =application.run(args);
        //发布事件
        context.publishEvent(new MyEvent("hello world"));
        context.close();
    }
}

方式二

通过Component自动注解

代码语言:txt
复制
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(MyApplication.class);

        SpringApplication.run(MyApplication.class, args);
        //添加监听器
        //application.addListeners(new MyListener());
        //获取应用上下文
        ConfigurableApplicationContext context =application.run(args);
        //发布事件
        context.publishEvent(new MyEvent("hello world"));

        context.close();
    }
}
代码语言:txt
复制
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@Component
public class MyListener implements ApplicationListener<MyEvent> {
    @Override
    public void onApplicationEvent(MyEvent myEvent) {
        System.out.println("监听事件 : "+myEvent.toString());
        System.out.println("监听事件参数 : "+myEvent.getSource().toString());
    }
}
image.png
image.png

其他方式不再一一讲解,小伙伴们可以了解概念后自行学习。

总结

springboot事件监听的流程:

自定义事件,一般是继承ApplicationEvent抽象类。

定义事件监听器,一般是实现ApplicationListener接口。

配置监听器,启动的时候,需要把监听器加入到spring容器中。

发布事件。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • Spring的事件监听
  • 事件发布与监听Demo
    • 导入依赖
      • MyEvent 自定义事件
        • MyListener自定义监听器
          • MyTest 模拟应用启动
            • 实际工作中应用
              • 方式一
              • 方式二
          • 总结
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
          http://www.vxiaotou.com