资讯专栏INFORMATION COLUMN

Spring中ApplicationListener的使用

charles_paul / 667人阅读

摘要:背景是事件机制的一部分,与抽象类类配合来完成的事件机制。如果容器中存在的,当调用方法时,对应的会被触发。单元测试类执行单元测试,会发现事件发布之后,监听器方法被调用,日志被打印出来。

背景

ApplicationListener是Spring事件机制的一部分,与抽象类ApplicationEvent类配合来完成ApplicationContext的事件机制。

如果容器中存在ApplicationListener的Bean,当ApplicationContext调用publishEvent方法时,对应的Bean会被触发。这一过程是典型的观察者模式的实现。

ApplicationListener源码
@FunctionalInterface
public interface ApplicationListener extends EventListener {

    /**
     * Handle an application event.
     * @param event the event to respond to
     */
    void onApplicationEvent(E event);

}
ContextRefreshedEvent事件的监听

以Spring的内置事件ContextRefreshedEvent为例,当ApplicationContext被初始化或刷新时,会触发ContextRefreshedEvent事件,下面我们就实现一个ApplicationListener来监听此事件的发生。

@Component // 需对该类进行Bean的实例化
public class LearnListener implements ApplicationListener {
   @Override
   public void onApplicationEvent(ContextRefreshedEvent event) {
      // 打印容器中出事Bean的数量
      System.out.println("监听器获得容器中初始化Bean数量:" + event.getApplicationContext().getBeanDefinitionCount());
   }
}

如上,便完成了一个事件监听类的实现和实例化。

自定义事件及监听

首先自定义事件:NotifyEvent。

public class NotifyEvent extends ApplicationEvent {


    private String email;

    private String content;

    public NotifyEvent(Object source) {
        super(source);
    }

    public NotifyEvent(Object source, String email, String content) {
        super(source);
        this.email = email;
        this.content = content;
    }
    // 省略getter/setter方法
}

定义监听器NotifyListener:

@Component
public class NotifyListener implements ApplicationListener {

    @Override
    public void onApplicationEvent(NotifyEvent event) {
        System.out.println("邮件地址:" + event.getEmail());
        System.out.println("邮件内容:" + event.getContent());
    }
}

监听器通过@Component注解进行实例化,并在onApplicationEvent中打印相关信息。

单元测试类:

@RunWith(SpringRunner.class)
@SpringBootTest
public class ListenerTest {

    @Autowired
    private WebApplicationContext webApplicationContext;

    @Test
    public void testListener() {

        NotifyEvent event = new NotifyEvent("object", "abc@qq.com", "This is the content");

        webApplicationContext.publishEvent(event);
    }
}

执行单元测试,会发现事件发布之后,监听器方法被调用,日志被打印出来。

原文链接:https://www.choupangxia.com/2...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75418.html

相关文章

  • spring ApplicationListener&ApplicationEvent

    摘要:准备好了我们可以开始向中发布,当发布后,所有在中的都会收到对应的。将类注入到的中。测试和通过方法将发布到应用上下文中,同时这个动作会触发收到事件。深入剖析发布与监听的过程在使用方法发布的时候,最终会调用到中的类的如下的一段代码。 本篇主要来聊一聊spring中ApplicationListener接口和ApplicationEvent类。 从命名上可以很容易的看出来一个是listene...

    keke 评论0 收藏0
  • spring boot学习(3): SpringApplication 事件监听

    摘要:在框架中,有多种事件这些时间会在不同的运行时刻发布,来通知监听者。本文仅仅介绍的事件的监听。也可以在文件中配置。 spring application listener 在 spring 框架中,有多种事件, 这些时间会在不同的运行时刻发布,来通知监听者。本文仅仅介绍 SpringApplicationEvent 的事件的监听。 事件类型 EventType 发布时间 App...

    Acceml 评论0 收藏0
  • Spring Boot启动过程及回调接口汇总

    摘要:创建及准备创建。目前已知关心这个事件的有要注意的是在这个阶段,里只有,是的加载工作的起点。原因是注入这些回调接口本身没有什么意义。在其构造函数内部间接的给注册了几个与相关注解的处理器。 相关代码在: https://github.com/chanjarster/spring-boot-all-callbacks 注:本文基于spring-boot 1.4.1.RELEASE, spri...

    Taonce 评论0 收藏0
  • 面试官:“谈谈Spring都用到了那些设计模式?”。

    摘要:会一直完善下去,欢迎建议和指导,同时也欢迎中用到了那些设计模式中用到了那些设计模式这两个问题,在面试中比较常见。工厂设计模式使用工厂模式可以通过或创建对象。 我自己总结的Java学习的系统知识点以及面试问题,已经开源,目前已经 41k+ Star。会一直完善下去,欢迎建议和指导,同时也欢迎Star: https://github.com/Snailclimb... JDK 中用到了那...

    Astrian 评论0 收藏0
  • Learn Spring - Spring IoC

    摘要:事件事件监听器,对监听到的事件进行处理。拥有一个成员变量,提供了容器监听器的注册表。注册事件监听器根据反射机制,使用的方法,从中找出所有实现的,将它们注册为容器的事件监听器,实际的操作就是将其添加到事件广播器所提供的监听器注册表中。 1. Spring的资源抽象接口 假如有一个文件位于Web应用的类路径下,用户可以通过以下方式对这个文件资源进行访问: 通过FileSystemReso...

    luzhuqun 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<