首先是 Dubbo启动方法,启动方式如SpringContainer为列子
第一步 加载Spring配置文件 代码如下:
//默认加载路径
public static final String DEFAULT_SPRING_CONFIG = "classpath*:META-INF/spring/*.xml";
//如果没有传入配置文件 则使用默认的spring配置路径
public void start() {
String configPath = ConfigUtils.getProperty(SPRING_CONFIG); if (configPath == null || configPath.length() == 0) {
//如果没有指定dub
bo.spring则使用默认的
configPath = DEFAULT_SPRING_CONFIG;
}
context = new ClassPathXmlApplicationContext(configPath.split("[,\\s]+"));
context.start();
}
第二步 加载完Spring文件,之后就开始解析了,主要类DubboNamespaceHandler ,如下是DubboNamespaceHandler的 init方法 注册了 各个模块
registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true));//应用信息
registerBeanDefinitionParser("module", new DubboBeanDefinitionParser(ModuleConfig.class, true));//模块信息
registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true));//注册信息
registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.class, true));//监控信息
registerBeanDefinitionParser("provider", new DubboBeanDefinitionParser(ProviderConfig.class, true));
registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true));
registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true));
registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true));
registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false));
registerBeanDefinitionParser("annotation", new DubboBeanDefinitionParser(AnnotationBean.class, true));
从上面看到最后3行 注册了 ServiceBean,ReferenceBean,reference这三个类等会再提及
具体的实现在 DubboBeanDefinitionParser的parser方法
private static BeanDefinition parse(Element element, ParserContext parserContext
就是解析各种配置文件 至此解析就完成了
上面注册了ServiceBean,现在就来看看这个bean具体有什么作用,内容主要还是在afterPropertiesSet 方法中
前面的操作都是预处理,看这个方法结尾的时候 存在一个 这么一段代码,至于这个 应该不用解释了吧 想想就是 暴露服务的地方
if (! isDelay()) {
export();
}
..... 待续 明天继续补充