Spring事件发布-ApplicationListener的原理浅析

之前在分析dubbo服务暴露流程时候,忽略了服务的延迟暴露

 

  • 延迟(配了delay参数)暴露服务是在ServiceBeanafterPropertiesSet方法(bean初始化时)中执行export(),然后通过延时任务(ScheduledExecutor)来触发服务暴露的。
  • 非延迟(未配置delay参数)暴露服务是在ServiceBeanonApplicationEvent方法(spring容器初始化完成时)中执行export()来立即触发服务暴露的。

Dubbo 2.6.5 版本以后,如果我们的服务启动过程需要平滑发布事件,就可以使用delay进行服务延迟暴露。只需在服务提供者的<dubbo:service/>标签中添加delay属性。

正数:单位为毫秒,表示在提供者对象创建完毕后的指定时间后再发布服务。
 -1:表示在Spring容器初始化完毕后再向注册中心暴露服务

 

那么spring的事件发布又是怎样的原理呢?


容器创建的对象的时候->Refresh()->finishRefresh(),即在容器刷新完成的时候执行监听器

原理分析:

1)、refresh;

 

2)、finishRefresh()

3)、publishEvent:事件发布的流程

getApplicationEventMulticaster().multicastEvent(applicationEvent,eventType);

  3.1)、getApplicationEventMulticaster(): 获取事件的多播器(派发器),多播器怎么来的呢?

在容器 refresh()的时候,会执行initApplicationEventMulticaster()方法

  3.2)、 multicastEvent 派发事件

先获取到所有的ApplicationListeners

如果有Executor,可以支持使用Executor进行异步派发,否则同步得方式执行派发

、最终执行事件:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值