Spring Cloud 系列-事件监听

背景

最近在系统性的学习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
<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 自定义事件

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

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

image.png
image.png

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

ApplicationPreparedEvent
ApplicationReadyEvent
ApplicationStartingEvent

MyListener自定义监听器

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 模拟应用启动

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

实际工作中应用

方式一

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自动注解

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();
    }
}
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

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

总结

springboot事件监听的流程:

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

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

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

发布事件。

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云原生架构实践

Jhipster技术栈定制 - 基于UAA的微服务之间安全调用

3个微服务都是通过Jhipster生成。 工程代码生成完之后,根据上一节启动的组件的实际情况,修改微服务配置文件中Eureka和database相关的配置。

1K30
来自专栏IT进修之路

原 荐 最新SpringCloud 服务注入

44830
来自专栏杨建荣的学习笔记

由报警邮件分析发现的备库oracle bug(r7笔记第12天)

昨天到公司之后,收到两份封报警邮件,可以看到在早晨6:30左右主库的v$dataguard_status检查时发现了一个错误。然后再2分钟后就自动恢复了。 一般...

27360
来自专栏极客编程

用Visual Studio Code和CLion进行EOS开发

每一个开发人员都需要一个良好的IDE,EOS开发也是一样,为项目开发过程构建一个良好的IDE环境是第一步。这就是为什么我们要写这个如何使用VS Code或者CL...

28220
来自专栏IT进修之路

原 荐 SpringBoot整合mybati

20740
来自专栏IT进修之路

原 spring boot Druid多

40930
来自专栏iOSDevLog

Xcode 9 制作 iOS 通用 Framework创建 Framework模拟器和真机通用 FrameworkBundle使用 Framework

50770
来自专栏黑白安全

Kali Linux渗透之获取主机名、MAC

------Kali Linux无线渗透之主机名、MAC与wifi信息获取------

29540
来自专栏bboysoul

cve-2017-11882漏洞利用

这是一个潜伏了17年之久的远程代码执行漏洞,这个漏洞影响了目前所有的流行office软件,原理是利用了office的一个EQNEDT32.EXE组件,就是公式编...

10040
来自专栏一个会写诗的程序员的博客

《Spring Boot极简教程》第8章 Spring Boot集成Groovy,Grails开发第8章 Spring Boot集成Groovy,Grails开发小结参考资料

本章介绍Spring Boot集成Groovy,Grails开发。我们将开发一个极简版的pms(项目管理系统)。

19620

扫码关注云+社区

领取腾讯云代金券