1. 程式人生 > >Spring源碼解析之事件派發器和監聽器

Spring源碼解析之事件派發器和監聽器

內部 ESS over 一個 framework processor spring abstract sharp

1、監聽器實現

  實現ApplicationListener接口:

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class MyApplicationListener implements ApplicationListener {
    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        System.out.println("事件"+event);
    }
}

  使用@EventListener註解

import org.springframework.context.ApplicationEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Component
public class MyServiceListener {

    @EventListener(classes = ApplicationEvent.class)
    public void myService(ApplicationEvent event){
        System.out.println("MyServiceListener類接收事件:"+ event);
    }
}

2、源碼解析前需要了解的事件發布工具類:ApplicationEventMulticaster接口

  ApplicationEventMulticaster接口的實現類可以管理大量ApplicationListener對象並向其發布事件。

    相關方法:

      void addApplicationListener(ApplicationListener<?> listener); (添加一個偵聽器以通知所有事件。)

      void addApplicationListenerBean(String listenerBeanName);(添加一個偵聽器以通知所有事件。)

      void multicastEvent(ApplicationEvent event);(將給定的應用程序事件多播到適當的偵聽器。)

      void multicastEvent(ApplicationEvent event, ResolvableType eventType);

  該工具類註入方式:refresh(); --> initApplicationEventMulticaster();

this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
(APPLICATION_EVENT_MULTICASTER_BEAN_NAME=“applicationEventMulticaster”)

3、實現ApplicationListener接口方式源碼解析:

  1)、向ApplicationEventMulticaster接口(AbstractApplicationEventMulticaster實現類)添加實現ApplicationListener接口的監聽器

      refresh();  (AnnotationConfigApplicationContext.java)

       registerListeners(); (AbstractApplicationContext.java)

          String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);  

          for (String listenerBeanName : listenerBeanNames){

            getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);

          }

  2)spring框架註入的內部類:org.springframework.context.event.internalEventListenerProcessor

  註入位置:

    技術分享圖片

         

Spring源碼解析之事件派發器和監聽器