spring的事件

188 阅读2分钟

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.获得早期事件调用监听器进行事件发布