理解 Spring ApplicationListener

理解 Spring ApplicationListener      ApplicationContext事件机制是观察者设计模式的实现,通过ApplicationEvent类和ApplicationListener接口,可以实现ApplicationContext事件处理。 如果容器中有一个ApplicationListenerBean,每当ApplicationContext发布ApplicationEvent时,ApplicationListen…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

      ApplicationContext事件机制是观察者设计模式的实现,通过ApplicationEvent类和ApplicationListener接口,可以实现ApplicationContext事件处理。

 如果容器中有一个ApplicationListener Bean,每当ApplicationContext发布ApplicationEvent时,ApplicationListener Bean将自动被触发。这种事件机制都必须需要程序显示的触发。

其中spring有一些内置的事件,当完成某种操作时会发出某些事件动作。比如监听ContextRefreshedEvent事件,当所有的bean都初始化完成并被成功装载后会触发该事件,实现ApplicationListener<ContextRefreshedEvent>接口可以收到监听动作,然后可以写自己的逻辑。

同样事件可以自定义、监听也可以自定义,完全根据自己的业务逻辑来处理。

内置事件

序号 Spring 内置事件 & 描述
1

ContextRefreshedEvent

ApplicationContext 被初始化或刷新时,该事件被发布。这也可以在 ConfigurableApplicationContext接口中使用 refresh() 方法来发生。此处的初始化是指:所有的Bean被成功装载,后处理Bean被检测并激活,所有Singleton Bean 被预实例化,ApplicationContext容器已就绪可用

2

ContextStartedEvent

当使用 ConfigurableApplicationContext (ApplicationContext子接口)接口中的 start() 方法启动 ApplicationContext 时,该事件被发布。你可以调查你的数据库,或者你可以在接受到这个事件后重启任何停止的应用程序。

3

ContextStoppedEvent

当使用 ConfigurableApplicationContext 接口中的 stop() 停止 ApplicationContext 时,发布这个事件。你可以在接受到这个事件后做必要的清理的工作。

4

ContextClosedEvent

当使用 ConfigurableApplicationContext 接口中的 close() 方法关闭 ApplicationContext 时,该事件被发布。一个已关闭的上下文到达生命周期末端;它不能被刷新或重启。

5

RequestHandledEvent

这是一个 web-specific 事件,告诉所有 bean HTTP 请求已经被服务。只能应用于使用DispatcherServlet的Web应用。在使用Spring作为前端的MVC控制器时,当Spring处理用户请求结束后,系统会自动触发该事件。

业务方监听事件举例

比如要监听ContextRefreshedEvent的时可以实现ApplicationListener接口,并且传入要监听的事件

@Component
public class TestApplicationListener implements ApplicationListener<ContextRefreshedEvent>{
    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        System.out.println(contextRefreshedEvent);
        System.out.println("TestApplicationListener............................");
    }
}

Jetbrains全家桶1年46,售后保障稳定

自定义事件

可以自定义事件,然后做完业务处理后手动发出。同上集成某个监听接口,接收到事件后进行业务处理

事件定义:

public class EmailEvent extends ApplicationEvent{
   private String address;
   private String text;
   public EmailEvent(Object source, String address, String text){
   super(source);
      this.address = address;
      this.text = text;
   }
   public EmailEvent(Object source) {
     super(source);
   }
   //......address和text的setter、getter
}

监听定义

public class EmailNotifier implements ApplicationListener{
   public void onApplicationEvent(ApplicationEvent event) {
     if (event instanceof EmailEvent) {
        EmailEvent emailEvent = (EmailEvent)event;
        System.out.println("邮件地址:" + emailEvent.getAddress());
        System.our.println("邮件内容:" + emailEvent.getText());
     } else {
        System.our.println("容器本身事件:" + event);
     }
   }
}

业务触发

public class SpringTest {
   public static void main(String args[]){
     ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
     //创建一个ApplicationEvent对象
     EmailEvent event = new EmailEvent("hello","abc@163.com","This is a test");
     //主动触发该事件
     context.publishEvent(event);
   }
}

不管是内置监听还是外部自定义监听一定要把实现ApplicationListener的类定义成一个bean才行,可以是通过注解@Component等也可以通过xml的方式去执行。


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210111.html原文链接:https://javaforall.net

(0)
上一篇 2025年7月27日 下午7:15
下一篇 2025年7月27日 下午7:43


相关推荐

  • LC5–ftp服务器密码检测

    LC5–ftp服务器密码检测目录实验目的:实验任务:实验原理:实验环境:实验步骤:实验目的:1.掌握FTP服务器的搭建方法2.理解FTP的使用。3.学习LC5激活成功教程密码工具的配置和使用方法。实验任务:1、架设一个简单的FTP服务器,分配用户,并…

    2022年7月24日
    7
  • anaconda pycharm设置编译器_anaconda默认环境

    anaconda pycharm设置编译器_anaconda默认环境Pycharm是一个非常好用的Python编译运行IDE,anaconda则用于管理Python中各种有用的包。下面讲讲在Ubuntu系统下让Pycharm能够使用anaconda管理的各种包。1找到编译器选项首先打开Pycharm然后点击File-&amp;amp;amp;amp;amp;gt;settings,然后就可以看到下图所示界面:…

    2022年8月28日
    7
  • KVM虚拟机创建虚拟机

    KVM虚拟机创建虚拟机KVM 虚拟化我们这边正在使用的虚拟机技术 VMware 其实只是虚拟技术的其中一种而已 事实上 现实接触到的虚拟机会有很多 所以需要熟知一些市场上主流的虚拟软件 比如 KVM 就是其中一种 使用 KVM 可以在虚拟机中再创建虚拟机 类似套娃 但是作用很大 比如 之前有说过的服务器群集 最简单的材料都需要四台服务器 一主二从一调度 如果使用 KVM 技术 那么意味着一台服务器就可以制作一个群集 当然 此消耗的内存占用比也是很高的 但同时也节省了因搭建群集而需要购买服务器的成本 KVM 准备步骤 1 为方便操作

    2026年3月26日
    2
  • WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None))解决办法汇总(超全)

    WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None))解决办法汇总(超全)解决办法 pip 换源指定安装源修改注册表信息就我自己在 windsows 系统上的经验来看 很有可能是由于系统代理软件的锅 一般我们可以通过以下三种方法解决 pip 换源 windows 换源参考 Ubuntu Windows 给 pip 换源打开 appdata 文件夹新建一个名为 pip 的文件夹在 pip 文件夹里面新建名为 pip ini 文件将下面信息添加在 pip ini 文件内 global timeout 6000index url https pypi tuna tsinghua edu

    2026年3月17日
    2
  • js生成二维码原理_二维码生成器原理

    js生成二维码原理_二维码生成器原理1.引用相关的js文件:        jquery.qrcode.js,qrcode.js    2.js代码如下:           3.html页面主要部分:       以上就可以生成自己的二维码了,手机扫描就可以跳转到指定的页面或者显示内容。   相关的代码在这:http://download.csdn.net/detail/go_walkin

    2022年10月17日
    4
  • Object的notify和notifyAll方法的区别

    Object的notify和notifyAll方法的区别区别 notify 只会唤醒等待该锁的其中一个线程 notifyAll 唤醒等待该锁的所有线程 既然 notify 会唤醒一个线程 并获取锁 notifyAll 会唤醒所有线程并根据算法选取其中一个线程获取锁 那最终结果不都是只有一个线程获取锁吗 那 JDK 为什么还需要做出来这两个方法呢 这两种同步方法本质上会有什么区别 这还要从对象内部锁的调度说起 对象内部锁其实 每个对象都拥有两个池 分

    2026年3月16日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号