前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >探索Spring事件监听机制的奇妙世界

探索Spring事件监听机制的奇妙世界

作者头像
索码理
发布2023-11-08 19:30:58
1760
发布2023-11-08 19:30:58
举报
文章被收录于专栏:索码理索码理

Spring事件监听机制是什么

Spring事件监听机制是一种在Spring应用程序中处理事件和消息的机制。它基于观察者模式,允许定义事件源、事件监听器和事件对象,以便在特定事件发生时执行自定义逻辑。

在Spring事件监听机制中,事件源负责生成事件,并在适当的时候触发它们。事件监听器则负责注册并监听特定类型的事件。当这些事件被触发时,事件监听器会执行相应的操作。

使用Spring事件监听机制的优缺点:

优点:

  1. 解耦:通过使用事件监听器,可以将事件的发布和处理分开,从而降低了代码之间的耦合度。这种设计使得代码更加灵活和可维护。
  2. 异步处理:Spring事件监听机制支持异步处理,这意味着事件的处理不会阻塞主程序,可以提高程序的效率和响应能力。
  3. 可扩展性:Spring事件监听机制提供了一个灵活的框架,可以轻松地添加自定义事件和监听器,从而满足特定的需求。
  4. 多线程安全性:由于Spring事件监听机制支持异步处理,因此可以有效地利用多线程,进一步提高程序的性能。

缺点:

  1. 复杂性:与传统的同步请求-响应模式相比,事件监听机制可能更加复杂。开发人员需要理解事件、监听器和发布者之间的关系,并正确地配置它们。
  2. 可能的性能问题:虽然事件监听机制可以提供更好的性能和响应能力,但在某些情况下,可能会导致不必要的计算和资源消耗。特别是在高并发场景下,需要谨慎地考虑性能问题。
  3. 错误处理:在事件监听器中处理异常时,需要特别小心。如果处理不当,可能会引发更大的问题。
  4. 调试困难:由于事件监听器是异步执行的,因此可能比同步代码更难调试。

总的来说,Spring事件监听机制的优缺点需要根据你的具体需求和场景来评估。如果你的应用程序需要处理大量并发事件,并且希望提高性能和响应能力,那么使用事件监听器是一个不错的选择。但是,如果你的应用程序不需要这些特性,或者你对其复杂性感到担忧,那么传统的同步模式可能更适合你的需求。

主要组件

Spring 事件监听机制包括以下几个主要组件:

  1. 事件(Event):事件是指应用程序中可能发生的特定动作或状态变化,它通常以POJO(Plain Old Java Object)的形式存在。在Spring中,事件对象一般是继承自ApplicationEvent类的自定义类,用于封装特定的事件信息。
  2. 事件发布者(Event Publisher):事件发布者是负责发布事件的组件。在Spring中,事件发布者通常是实现了ApplicationEventPublisher接口的组件,比如ApplicationContext(应用上下文)、ApplicationEventPublisherAware接口的实现类、或者使用 @Autowire注解注入的ApplicationEventPublisher实例。事件发布者通过调用publishEvent方法来发布特定的事件,通知所有监听该事件的监听器。
  3. 事件监听器(Event Listener):事件监听器是用于监听特定事件并做出响应的组件。在Spring中,我们可以通过实现ApplicationListener接口或使用 @EventListener 注解来定义事件监听器。事件监听器监听到事件发生时,会执行相应的业务逻辑。

内置的事件监听类

Spring框架提供了许多内置的事件监听类,用于处理不同的事件。以下是一些常用的Spring事件监听类:

  1. ContextRefreshedEvent:当ApplicationContext被初始化或刷新时触发。可以用来执行在应用程序启动后需要进行的初始化任务。
  2. ContextStartedEvent:当ApplicationContext被启动(调用start()方法)时触发。可以用来执行在应用程序启动后需要进行的特定任务。
  3. ContextStoppedEvent:当ApplicationContext被停止(调用stop()方法)时触发。可以用来执行在应用程序停止前需要进行的清理任务。
  4. ContextClosedEvent:当ApplicationContext被关闭(调用close()方法)时触发。可以用来执行在应用程序关闭前需要进行的清理任务。
  5. RequestHandledEvent:当一个HTTP请求被处理完成后触发。可以用来记录请求的处理信息或进行其他相关操作。

这些只是一些常见的事件监听类,实际上Spring还提供了更多的事件监听类,可以满足不同场景下的需求。开发者也可以自定义事件监听类,继承自ApplicationEvent,以实现自己的特定事件监听逻辑。

Event

自定义事件监听类

在学习自定义事件监听类之前,先来了解一下Spring事件监听机制的基本工作流程:

  1. 定义事件:事件通常是扩展ApplicationEvent的类的对象,它包含有关事件的信息。
  2. 定义监听器:监听器是实现了ApplicationListener接口的类,被定义为处理特定事件类型的类。
  3. 注册监听器:通过将监听器注册到Spring容器中,或者手动添加到ApplicationContext中。
  4. 发布事件:在需要的情况下,通过调用ApplicationContextpublishEvent()方法发布事件,Spring将该事件传递给所有匹配的监听器。

Spring事件监听机制,就像你关注了某个人,他一旦有作品更新,你就能立马收到消息一样。

下面举个例子自定义一个Spring事件监听功能,比如你喜欢波多老师并且关注了她,波多老师一旦发布新电影你就能收到并且观看。具体代码如下:

  1. 定义事件MovieEvent
代码语言:javascript
复制
public class MovieEvent extends ApplicationEvent {

    private String movieName;
    
    public MovieEvent(Actor source , String movieName) {
        super(source);
        this.movieName = movieName;
    }


    public String getMovieName() {
        return movieName;
    }
}
代码语言:javascript
复制
@Data
public class Actor {

    private String name;

}
  1. 定义监听器MovieListener

定义监听器有两种方式,一是实现 ApplicationListener接口,而是使用 @EventListener 注解。下面使用这两种方式分别定义一个监听器。

代码语言:javascript
复制
@Component
public class MovieListener implements ApplicationListener<MovieEvent> {

    @Override
    public void onApplicationEvent(MovieEvent event) {
        Actor actor = (Actor) event.getSource();
        String movieName = event.getMovieName();

        System.out.println("实现类监听器 监听到"+actor.getName()+" 发布了新电影,电影名字叫:"+movieName);
    }
}
代码语言:javascript
复制
@Component
public class MovieListener2 {

    @EventListener
    public void listener(MovieEvent event) {
        Actor actor = (Actor) event.getSource();
        String movieName = event.getMovieName();

        System.out.println("注解监听器 监听到 "+actor.getName()+" 发布了新电影,电影名字叫:"+movieName);
    }
}

@EventListener注解是方法级别的注解,使用它可以在一个类中定义多个监听方法。

  1. 测试事件发布功能
代码语言:javascript
复制
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MqApplication.class)
public class RestTest {

    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    @Autowired
    private ApplicationContext applicationContext;

    @Test
    public void testEvent(){
        Actor boDuo = new Actor();
        boDuo.setName("波多老师");

        MovieEvent movieEvent = new MovieEvent(boDuo , "好好学习,别胡思乱想!");
        //通过applicationContext发布事件
        applicationContext.publishEvent(movieEvent);
    }
}

测试结果:

代码语言:javascript
复制
实现类监听器 监听到波多老师 发布了新电影,电影名字叫:好好学习,别胡思乱想!
注解监听器 监听到 波多老师 发布了新电影,电影名字叫:好好学习,别胡思乱想!

通过上面的测试结果可以发现,两个监听类最终都监听到了MovieEvent ,都在控制台打印结果了。实际上Spring的事件监听机制对于同一个事件的监听是默认情况下同步的。当事件被发布时,Spring会依次通知所有监听该事件的监听器,并在事件发布的同一线程中依序执行监听器的处理逻辑。这意味着,当一个事件被触发后,事件监听器的执行是按照注册的顺序依次进行的,前一个监听器完成后才会执行下一个监听器。只有当所有监听器都执行完毕后,事件发布者才会继续往下执行。

如果想实现异步可以在监听器的方法上添加 @Async注解,或在配置文件中进行相应的配置,可以使监听器的处理逻辑在不同的线程中执行,从而实现异步处理。

如果是想实现监听器按照指定顺序执行,可以使用 @Order 注解。**@Order**注解的值越小,优先级越高,即执行顺序越靠前。

总结

总的来说,Spring事件监听机制使用起来简单方便,可以是组件之间解耦,提高了代码的可维护性和可扩展性。当需要使用监听机制的时候,Spring的事件监听机制是个很好的选择之一。

- END -

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-11-08,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 索码理 微信公众号,前往查看

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

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

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