小言_互联网的博客

Spring 监听器listener原理

396人阅读  评论(0)

1.创建本地事件和事件监听器


   
  1. /**
  2. * 事件类
  3. */
  4. public class MyEventA extends ApplicationEvent {
  5. private static final long serialVersionUID = 1L;
  6. public MyEventA (Object source) {
  7. super(source);
  8. System.out.println( "MyEventA 构造方法被执行了...");
  9. }
  10. public void out (String name){
  11. System.out.println( "MyEventA .... out方法执行了"+name);
  12. }
  13. }

   
  1. /**
  2. * 监听器
  3. */
  4. public class MyListenerA implements ApplicationListener<MyEventA> {
  5. @Override
  6. public void onApplicationEvent (MyEventA event) {
  7. System.out.println( "======MyListenerA 监听器触发了...");
  8. // 执行事件中的特定方法
  9. event.out( "AAAAA");
  10. }
  11. }

2 触发发送事件


   
  1. public class TestListenerController {
  2. @Autowired
  3. private ApplicationContext mApplicationContext;
  4. @GetMapping("/testlistener")
  5. public String testPublishEvent (){
  6. System.out.println( "====>get");
  7. mApplicationContext.publishEvent( new MyEventA( new Object()));
  8. return "";
  9. }
  10. }

3 添加注册器到spring.factories

图1

4 项目启动时候会将listener 实例化到内存中

走到SpringApplication的构造方法中,会走到getSpringFactoriesInstances方法中,实例化listener类型的类,通过setListeners方法保存在内存中

图2

图3

5. 执行Controller方法

http://localhost:8081/testlistener

会执行mApplicationContext.publishEvent(new MyEventA(new Object()));

图4

执行到SimpleApplicationEventMulticaster类中的multicastEvent

图5

执行SimpleApplicationEventMulticaster父类AbstractApplicationEventMulticaster中的getApplicationListeners方法找到匹配的listener,在执行到retrieveApplicationListeners方法

图6

图7

执行GenericApplicationListenerAdapter类中supportsEventType方法

declaredEventType.isAssignableFrom(eventType))将需要监听的对象和发送的事件对象匹配,匹配成功将此listener,也就是之前声明的MyListenerA实例化对象,添加到发送列表

图8

最好执行图5中的invokeListener(listener, event),将事件发送到对应的监听器

综上流程可以看出,spring的事件发送接收是一种观察者模式,即注册监听模式,当应用启动的时候,根据spring.factories文件,将监听器实例化后保存在内存中,到有触发动作是,根据发送的事件类型,从所有初始化的监听器中找到匹配的监听器,在发送事件对象


转载:https://blog.csdn.net/dalong3976/article/details/128688319
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场