一、@EventListener
注解
使用@EventListener
注解可以使得任何方法实现监听
@Service
public class UserService {
@EventListener(classes = {ApplicationEvent.class})
public void listen(ApplicationEvent event){
System.out.println("UserService监听事件:" + event);
}
}
测试
@Test
public void testExtension(){
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfigOfExtension.class);
context.publishEvent(new ApplicationEvent(new String("发布的事件")) {});
context.close();
}
打印结果:
二、@EventListener
注解实现原理——SmartInitializingSingleton
使用EventListenerMethodProcessor
处理器来解析方法上的@EventListener
注解
EventListenerMethodProcessor
处理器实现了SmartInitializingSingleton
接口
SmartInitializingSingleton
接口中的afterSingletonsInstantiated()
方法会在所有的单实例bean创建完成之后调用
首先ioc容器创建对象,并刷新容器
refresh()
方法调用finishBeanFactoryInitialization(beanFactory)
完成bean的初始化工作
finishBeanFactoryInitialization(beanFactory)
方法调用preInstantiateSingletons()
方法初始化单实例bean
preInstantiateSingletons()
方法会先创建所有的单实例bean,然后遍历所有单实例bean并判断是否实现SmartInitializingSingleton
接口,如果是则调用afterSingletonsInstantiated()
方法
获取每个bean中标注@EventListener
注解的方法,再通过EventListenerFactory
创建ApplicationListener
对象,再把这个ApplicationListener
对象保存在applicationContext
也就是ioc容器中
添加到容器中以后,会把它注册到派发器applicationEventMulticaster
中,从而实现监听作用