在前面的文章中,介绍了SpringContainer的加载过程
该篇文章将主要讲解SpringContainer.start()方法中具体进行了什么操作,使得dubbo成功运行了起来
如果这边文章帮助到你了,帮忙支付宝领个红包哇 !!感激不尽
打开支付宝首页搜索“530724503” 立即领红包
先上SpringContainer.start()的代码
发现原来就是Spring容器的加载,前面就是读取配置文件,然后进行监听器添加,注册ShutdownHook,注意在new 容器的时候传refresh是false,所以容器没有在new的时候立马刷新,和之前版本有所区别。
容器创建好后调用context.refresh()中进行初始化操作
在Spring的refresh操作中,针对dubbo来说我着重关注的是下面几个方法
prepareBeanFactory(beanFactory);
创建bean工厂加载配置文件中的对象到容器中
registerListeners();
注册监听器,包括在SpringContainer.start()中添加的监听器和BeanDefinitionMap中实现ApplicationListener的监听器到defaultRetriever中
getApplicationEventMulticaster().addApplicationListener(listener);
getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
以上方法将监听器放入defaultRetriever中
finishBeanFactoryInitialization(beanFactory);
初始化BeanDefinitionMap中不延迟的对象
注意:在初始化ServiceBean的实例对象时,因为ServiceBean实现了InitializingBean,所以会调用afterPropertiesSet() 方法,如果ServiceBean不是延迟的,则在afterPropertiesSet()中执行export();在线程池中进行出口登记
finishRefresh();
完成初始化操作
在该方法中会调用
publishEvent(new ContextRefreshedEvent(this));推送事件
从而会触发DubboApplicationListener和ServiceBean的onAppliactionEvent
ServiceBean.onApplicationEvent内有exprot()方法,从而将service的出口做了登记
如果这边文章帮助到你了,帮忙支付宝领个红包哇 !!感激不尽
打开支付宝首页搜索“530724503” 立即领红包
详细流程见下面的流程图