Spring源碼解析之事件派發器和監聽器
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源碼解析之事件派發器和監聽器