Spring事件监听原理

1 简述Spring的生命周期

不论是Spring的监听机制原理还是Spring AOP的原理,都是依托于Spring的生命周期,所以要了解Spring的监听机制原理就需要先了解Spring的生命周期

简述Spring生命周期

1 创建类扫描器和注解解析器赋值给BeanFactory

2 将传入的主配置类的信息封装成BeanDefinition放入BeanFactory的BeanDefinitionMap

3 根据主配置的BeanDefinition去扫描所有的Bean类,并且将相应的类信息封装成BeanDefinition放入BeanDefinitionMap

4 注册后置处理器(将后置处理器创建实例放入容器)

5 初始化事件广播器

6 完成Bean的初始化

在Bean的初始化阶段,有许多的后置处理器阶段,最重要的,使用最多的就是初始化后的后置处理器阶段
2 简述Spring 事件监听原理

SimpleApplicationEventMulticaster:事件广播器

	/**
	 * Helper class that encapsulates a general set of target listeners.
	 */
	private class DefaultListenerRetriever {
        //保存事件监听器
		public final Set<ApplicationListener<?>> applicationListeners = new LinkedHashSet<>();

		public final Set<String> applicationListenerBeans = new LinkedHashSet<>();

		public Collection<ApplicationListener<?>> getApplicationListeners() {
			List<ApplicationListener<?>> allListeners = new ArrayList<>(
					this.applicationListeners.size() + this.applicationListenerBeans.size());
			allListeners.addAll(this.applicationListeners);
			if (!this.applicationListenerBeans.isEmpty()) {
				BeanFactory beanFactory = getBeanFactory();
				for (String listenerBeanName : this.applicationListenerBeans) {
					try {
						ApplicationListener<?> listener =
								beanFactory.getBean(listenerBeanName, ApplicationListener.class);
						if (!allListeners.contains(listener)) {
							allListeners.add(listener);
						}
					}
					catch (NoSuchBeanDefinitionException ex) {
						// Singleton listener instance (without backing bean definition) disappeared -
						// probably in the middle of the destruction phase
					}
				}
			}
			AnnotationAwareOrderComparator.sort(allListeners);
			return allListeners;
		}
	}

//在事件广播器中,有一个内部类,用于保存所有的时间监听器

1 在Spring的生命周期中,会自动初始化事件广播器(SimpleApplicationEventMulticaster)

2 在Spring的生命周期的初始化后的后置处理器阶段,会将每一个Bean都判断一下,当前Bean是不是实现了ApplicationListener接口,如果实现了此接口,那就将当前Bean放入监听器集合中

3 当在业务中使用上下文发布事务时,会使用事件广播器对象调用筛选方法,根据传入的事件,筛选出与之对应的所有事件监听器集合,然后变量这个集合,在遍历集合的过程中,如果Executor对为null,那是就直接执行监听器的回调方法,如果Executor不为null,那么开启一个线程去执行监听器的回调方法(异步)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值