网站快速建设视频,wordpress中级课程凌风主讲,wordpress做博客,产品拍摄文章目录 什么是Spring事件监听机制主要组件内置的事件监听类自定义事件监听类总结 前些天发现了一个巨牛的人工智能学习网站#xff0c;通俗易懂#xff0c;风趣幽默#xff0c;忍不住分享一下给大家。点击跳转到网站。 什么是Spring事件监听机制
Spring事件监听机制是Spr… 文章目录 什么是Spring事件监听机制主要组件内置的事件监听类自定义事件监听类总结 前些天发现了一个巨牛的人工智能学习网站通俗易懂风趣幽默忍不住分享一下给大家。点击跳转到网站。 什么是Spring事件监听机制
Spring事件监听机制是Spring框架中的一种设计模式主要用于处理应用程序的各种事件。这种机制基于发布-订阅设计模式允许将业务逻辑解耦并能更好地组织和管理代码。
使用 Spring 事件监听机制的好处
解耦通过将事件的响应逻辑交给监听器处理可以将事件源和监听器解耦降低代码的耦合度。可扩展性可以添加新的监听器来处理新的事件类型而无需修改原有代码。可重用性相同类型的事件可以在多个地方处理提高了代码的可重用性。异步处理事件监听机制支持异步处理可以避免阻塞主线程提高应用程序的性能。事件过滤可以使用条件筛选需要处理的事件只对符合条件的事件进行处理。
主要组件
Spring 事件监听机制包括以下几个主要组件
事件源Event Source事件源是事件的发起者通常是一个应用程序中的特定组件或服务。当事件源发生特定事件时会触发事件的发布。事件Event事件是事件源发出的消息通常包含与事件相关的数据。事件可以是自定义的类继承自 Spring 的 ApplicationEvent 类。监听器Listener监听器是订阅了事件源的事件并负责处理事件的组件。监听器需要实现 Spring 的 ApplicationListener 接口并指定要监听的事件类型该接口定义了一个onApplicationEvent方法用于处理接收到的事件。。发布者Publisher发布者是负责将事件发布给所有注册的监听器的组件。在 Spring 框架中可以使用 ApplicationContext的 publishEvent 方法来发布事件。应用上下文ApplicationContextApplicationContext是Spring中的一个中心类它提供了一个将事件发布到监听器的机制。
内置的事件监听类
Spring框架提供了许多内置的事件监听类用于处理不同的事件。以下是一些常用的Spring事件监听类 ContextRefreshedEvent当ApplicationContext被初始化或刷新时触发。可以用来执行在应用程序启动后需要进行的初始化任务。 ContextStartedEvent当ApplicationContext被启动调用start()方法时触发。可以用来执行在应用程序启动后需要进行的特定任务。 ContextStoppedEvent当ApplicationContext被停止调用stop()方法时触发。可以用来执行在应用程序停止前需要进行的清理任务。 ContextClosedEvent当ApplicationContext被关闭调用close()方法时触发。可以用来执行在应用程序关闭前需要进行的清理任务。 RequestHandledEvent当一个HTTP请求被处理完成后触发。可以用来记录请求的处理信息或进行其他相关操作。
这些只是一些常见的事件监听类实际上Spring还提供了更多的事件监听类可以满足不同场景下的需求。开发者也可以自定义事件监听类继承自ApplicationEvent以实现自己的特定事件监听逻辑。 自定义事件监听类
自定义事件监听类之前 先来了解一下Spring事件监听机制的基本工作流程
定义事件事件通常是扩展ApplicationEvent的类的对象它包含有关事件的信息。定义监听器监听器是实现了ApplicationListener接口的类被定义为处理特定事件类型的类。注册监听器通过将监听器注册到Spring容器中或者手动添加到ApplicationContext中。发布事件在需要的情况下通过调用ApplicationContext的publishEvent()方法发布事件Spring将该事件传递给所有匹配的监听器。
Spring机制基于发布-订阅设计模式这就像你关注了某个人他一旦有作品更新你就能立马收到消息一样。 下面举个例子自定义一个Spring事件监听功能比如你喜欢波多老师并且关注了她波多老师一旦发布新电影你就能收到并且观看。具体代码如下
定义事件MovieEvent
public class MovieEvent extends ApplicationEvent {private String movieName;public MovieEvent(Actor source , String movieName) {super(source);this.movieName movieName;}public String getMovieName() {return movieName;}
}Data
public class Actor {private String name;}定义监听器MovieListener
定义监听器有两种方式一是实现 ApplicationListener接口而是使用 EventListener 注解。下面使用这两种方式分别定义一个监听器。
Component
public class MovieListener implements ApplicationListenerMovieEvent {Overridepublic void onApplicationEvent(MovieEvent event) {Actor actor (Actor) event.getSource();String movieName event.getMovieName();System.out.println(实现类监听器 监听到actor.getName() 发布了新电影电影名字叫movieName);}
}Component
public class MovieListener2 {EventListenerpublic void listener(MovieEvent event) {Actor actor (Actor) event.getSource();String movieName event.getMovieName();System.out.println(注解监听器 监听到 actor.getName() 发布了新电影电影名字叫movieName);}
}EventListener注解是方法级别的注解使用它可以在一个类中定义多个监听方法。
测试事件发布功能
RunWith(SpringRunner.class)
SpringBootTest(classes MqApplication.class)
public class RestTest {Autowiredprivate ApplicationEventPublisher applicationEventPublisher;Autowiredprivate ApplicationContext applicationContext;Testpublic void testEvent(){Actor boDuo new Actor();boDuo.setName(波多老师);MovieEvent movieEvent new MovieEvent(boDuo , 好好学习别胡思乱想);applicationContext.publishEvent(movieEvent);}
}测试结果
实现类监听器 监听到波多老师 发布了新电影电影名字叫好好学习别胡思乱想
注解监听器 监听到 波多老师 发布了新电影电影名字叫好好学习别胡思乱想ApplicationContext 继承了 ApplicationEventPublisher 所以发布事件既可以通过 ApplicationEventPublisher#publishEvent() 方法也可以通过ApplicationContext#publishEvent() 方法。
通过上面的测试结果可以发现两个监听类最终都监听到了MovieEvent 都在控制台打印结果了。 实际上Spring的事件监听机制对于同一个事件的监听是同步的默认情况下是同步的。当事件被发布时Spring会依次通知所有监听该事件的监听器并在事件发布的同一线程中依序执行监听器的处理逻辑。 这意味着当一个事件被触发后事件监听器的执行是按照注册的顺序依次进行的前一个监听器完成后才会执行下一个监听器。只有当所有监听器都执行完毕后事件发布者才会继续往下执行。
如果想实现异步可以在监听器的方法上添加Async注解或在配置文件中进行相应的配置可以使监听器的处理逻辑在不同的线程中执行从而实现异步处理。
如果是想实现监听器按照指定顺序执行可以使用 Order 注解Order注解的值越小优先级越高即执行顺序越靠前。
总结
总的来说Spring事件监听机制使用起来简单方便可以是组件之间解耦提高了代码的可维护性和可扩展性。当需要使用监听机制的时候Spring的事件监听机制是个很好的选择之一。