Dubbo源码分析

首先是 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();
        }
     
   ..... 待续 明天继续补充

你可能感兴趣的:(Dubbo源码分析)