Dubbo调用的工程启动的时候使用继承ContextLoaderListener的方式启动,因为在Dubbo服务调用需要用到一些通过bean查库加载的缓存信息,所以采取了以下方式启动
- 通过读取xml的方式初始化AbstractApplicationContext以及Dubbo优雅停机
- 调用refresh方法();
刷新bean工厂的时候,会创建bean,会执行bean的init方法,如果bean实现了initailizedbean接口,则会调用afterPropertiesSet方法;
- 在Refresh方法中会调用DefaultLifecycleProcessor的onRefresh()方法
初始化其他的特殊的bean
实际调用=>UiApplicationContextUtils#initThemeSource(ApplicationContext context)
方法定义:为给定的application context初始化ThemeSource,自动检测一个名字为"themeSource"的bean。 如果没有这样的bean被找到,一个默认的空ThemeSource被使用。
- 调用DefaultLifecycleProcessor(没有才用默认,有的话上一句代码初始化)的onRefresh()方法
里面会startBeans();
生命周期交给lifecycle
- 发布事件ContextRefreshedEvent();
发布事件,
注:Dubbo的服务接口配置在Spring使用DubboNamespaceHandler解析的时候会将<Dubbo:Service>标签的bean解析成为ServiceBean,ServiceBean实现了InitializingBean,在重写的afterPropertiesSet之后会判断是否延迟暴露服务,如果不配置,就会直接暴露,在程序一些必要参数还未加载的时候就可以调用服务,会造成麻烦;
所以将Service的Delay配置成-1;
事件发布后,ServiceBean因为实现了ApplicationListener,所以会监听到事件,
调用方法暴露服务;
Dubbo相关配置:
<dubbo:reference id="" interface="" cluster="" connections="2" version="1.0.0" />
connections表示可以建立单一长连接的个数;
Delay为-1时,只有在Springrefresh完成之后才会暴露服务;
Group 一个接口多个实现的时候使用分组;
Cluster:默认为failover,这时retries才会起作用,除了本次调用之外的尝试次数;