Spring事件监听机制是一种在Spring应用程序中处理事件和消息的机制。它基于观察者模式,允许定义事件源、事件监听器和事件对象,以便在特定事件发生时执行自定义逻辑。
在Spring事件监听机制中,事件源负责生成事件,并在适当的时候触发它们。事件监听器则负责注册并监听特定类型的事件。当这些事件被触发时,事件监听器会执行相应的操作。
使用Spring事件监听机制的优缺点:
优点:
缺点:
总的来说,Spring事件监听机制的优缺点需要根据你的具体需求和场景来评估。如果你的应用程序需要处理大量并发事件,并且希望提高性能和响应能力,那么使用事件监听器是一个不错的选择。但是,如果你的应用程序不需要这些特性,或者你对其复杂性感到担忧,那么传统的同步模式可能更适合你的需求。
Spring 事件监听机制包括以下几个主要组件:
publishEvent
方法来发布特定的事件,通知所有监听该事件的监听器。Spring框架提供了许多内置的事件监听类,用于处理不同的事件。以下是一些常用的Spring事件监听类:
这些只是一些常见的事件监听类,实际上Spring还提供了更多的事件监听类,可以满足不同场景下的需求。开发者也可以自定义事件监听类,继承自ApplicationEvent,以实现自己的特定事件监听逻辑。
Event
在学习自定义事件监听类之前,先来了解一下Spring事件监听机制的基本工作流程:
publishEvent()
方法发布事件,Spring将该事件传递给所有匹配的监听器。Spring事件监听机制,就像你关注了某个人,他一旦有作品更新,你就能立马收到消息一样。
下面举个例子自定义一个Spring事件监听功能,比如你喜欢波多老师并且关注了她,波多老师一旦发布新电影你就能收到并且观看。具体代码如下:
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;
}
定义监听器有两种方式,一是实现 ApplicationListener接口,而是使用 @EventListener 注解。下面使用这两种方式分别定义一个监听器。
@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);
}
}
@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注解是方法级别的注解,使用它可以在一个类中定义多个监听方法。
@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);
}
}
测试结果:
实现类监听器 监听到波多老师 发布了新电影,电影名字叫:好好学习,别胡思乱想!
注解监听器 监听到 波多老师 发布了新电影,电影名字叫:好好学习,别胡思乱想!
通过上面的测试结果可以发现,两个监听类最终都监听到了MovieEvent ,都在控制台打印结果了。实际上Spring的事件监听机制对于同一个事件的监听是默认情况下同步的。当事件被发布时,Spring会依次通知所有监听该事件的监听器,并在事件发布的同一线程中依序执行监听器的处理逻辑。这意味着,当一个事件被触发后,事件监听器的执行是按照注册的顺序依次进行的,前一个监听器完成后才会执行下一个监听器。只有当所有监听器都执行完毕后,事件发布者才会继续往下执行。
如果想实现异步可以在监听器的方法上添加 @Async注解,或在配置文件中进行相应的配置,可以使监听器的处理逻辑在不同的线程中执行,从而实现异步处理。
如果是想实现监听器按照指定顺序执行,可以使用 @Order 注解。**@Order**注解的值越小,优先级越高,即执行顺序越靠前。
总的来说,Spring事件监听机制使用起来简单方便,可以是组件之间解耦,提高了代码的可维护性和可扩展性。当需要使用监听机制的时候,Spring的事件监听机制是个很好的选择之一。
- END -