Spring的内置事件
ContextRefreshedEvent (Spring容器加载完毕会发布这个事件)
如果想在容器初始化后处理业务,可以监听这个事件
ContextStartedEvent
ContexStoppedEvent
ContexClosedEvent
如果想在容器关闭的时候处理业务,可以监听这个事件
RequestHanderEvent
Spring容器中两种监听器
1.基于接口的
实现ApplicationListener接口
2.基于事件的
加上@EventLitener注解
Spring监听器源码
prepareRefresh();
1.设置状态
2.设置环境变量
3.判断环境变量
4.注册早期事件,不需要手动发布,会自动发布
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
1.xml方式加载bean定义会在这个方法加载
2.javaConfig只是刷新bean工厂
prepareBeanFactory(beanFactory);
1.注册bean的后置处理器,注册到beanPostProcessors,在bean初始化之前 调用6个awaer
2.设置一些Aware忽略的set方法,不允许自动注入(属性注入的时候体现),xml可以在配置文件里设置,注解可以在bean工厂后置处理器里设置自动装配方式
3.允许自动装配配BeanFactory,ResourceLoader,ApplicationEventPublisher,ApplicationContext
4.注册一个事件监听器探测器后置处理器 解析接口方式的监听器会在bean初始化之后被调用 @lazy不会初始化
postProcessBeanFactory(beanFactory);
1.提供给web,其他容器用的,这边还有一个aware servletContextAware
invokeBeanFactoryPostProcessors(beanFactory);
1.调用bean工厂的后置处理器,解析配置类
registerBeanPostProcessors(beanFactory);
注册bean的后置处理器
initMessageSource();
注册国际化
initApplicationEventMulticaster();
1.初始化一个事件多播器,用来管理监听器,由他负责调用事件对应的监听器
2.publishEvent方法最终会调用事件多播器由他负责调用事件对应的监听器
onRefresh();
没啥用的
registerListeners();
1.循环applicationListener但这个里面是空的,这个数组里面是通过手动调用添加进去的是空的
2.从bean定义的容器当中拿到ApplicationListener这个类型的监听器,获取实现了ApplicationListener接口的监听器(注解方式在其他地方) 防止lazy加载的监听器漏网
3.把ApplicationListener这个类型的监听器注册多播器当中去
4.获得早期事件调用监听器进行事件发布