在实际的开发中,常常遇到这种场景:
当某件事情完成后,需要通知其他的模块进行相应的处理。我们可以一个一个的发送请求去通知,但是更好的处理方式是通过事件监听来完成。事件监听是基于设计模式中的发布-订阅,观察者模式来实现的。
接下来我们基于springboot来讲述自定义事件监听的流程。
- 配置自定义事件: MyEvent extends ApplicationEvent
- 配置自定义监听器: MyApplicationListener implements ApplicationListener
- 事件发布 : 利用spring容器进行事件发布:context.publishEvent
其中 2 配置自定义监听器有四种方式:
2.1: 继承ApplicationEvent 重写 onApplicationEvent,当前bean必须注入到spring容器中。
public class MyEvent extends ApplicationEvent { public MyEvent(Object source) { super(source); } } @Component public class MyApplicationListener implements ApplicationListener{ public void onApplicationEvent(ApplicationEvent event) { System.out.println(event.getSource()); System.out.println(event.getClass().getName()); } }
2.2: 继承ApplicationEvent 重写 onApplicationEvent,利用容器转载监听器 context.addApplicationListener(new MyApplicationListener());
public class MyEvent extends ApplicationEvent { public MyEvent(Object source) { super(source); } } public class MyApplicationListener implements ApplicationListener{ public void onApplicationEvent(ApplicationEvent event) { System.out.println(event.getSource()); System.out.println(event.getClass().getName()); } } @SpringBootApplication(scanBasePackages = "com.example.eventListener") public class SpringbootApplication_listener { public static void main(String[] args) { SpringApplication springApplication = new SpringApplication(SpringbootApplication_listener.class); ConfigurableApplicationContext context = springApplication.run(args); context.addApplicationListener(new MyApplicationListener()); context.publishEvent(new MyEvent("测试事件监听")); // context.close(); } }
2.3: 继承ApplicationEvent 重写 onApplicationEvent,配置文件中添加监听器:
public class MyEvent extends ApplicationEvent { public MyEvent(Object source) { super(source); } } public class MyApplicationListener implements ApplicationListener{ public void onApplicationEvent(ApplicationEvent event) { System.out.println(event.getSource()); System.out.println(event.getClass().getName()); } }
application.yml
context:
listener:
classes: com.example.eventListener.MyApplicationListener
2.4:利用注解@EventListener,可以自定义多个方法,该类不需要继承ApplicationEvent,当前类必须注入到spring容器中。
public class MyEvent extends ApplicationEvent { public MyEvent(Object source) { super(source); } } @Component public class MyApplicationListener { @EventListener public void onApplicationEvent11(ApplicationEvent event) { System.out.println(event.getSource()); System.out.println(event.getClass().getName()); } }