乐趣区

6Dubbo的服务导出

1、寻找 Dubbo 服务导出的入口方法

context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/dubbo-demo-provider.xml"});

// 删除了一些步骤
public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {
        try {
            // 1. 里面的核心代码就是初始化了 applicationEventMulticaster, 用户后面发布事件使用
            // this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
            initApplicationEventMulticaster();

            // 2. 初始化非延迟加载的 bean, 这里就会初始化 dubbo 配置的一些 bean, 包括 ServiceBean, 用于服务导出
            finishBeanFactoryInitialization(beanFactory);

            // 3. 发布容器刷新事件, 这里面是服务导出的入口
            finishRefresh();}
    }
}
// 步骤 2 分析
// 这里 Spring 容器会初始化非延迟加载的 bean, 包括 <dubbo:service/> 表示的 bean
// <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService"/>
finishBeanFactoryInitialization(beanFactory);
// Spring 容器初始化 <dubbo:service/> 表示的 ServiceBean 时会创建 ServiceBean 对象, 由于 ServiceBean 实现了
// ApplicationContextAware 接口, 所以 Spring 容器会先调用 setApplicationContext 给其注入 Spring 容器
class ServiceBean<T> extends ServiceConfig<T> implements InitializingBean, DisposableBean,
          ApplicationContextAware, ApplicationListener<ContextRefreshedEvent>, BeanNameAware {
   @Override
   public void setApplicationContext(ApplicationContext applicationContext) {
       this.applicationContext = applicationContext;
       // 给 SpringExtensionFactory 注入 Spring 容器
       SpringExtensionFactory.addApplicationContext(applicationContext);
       if (applicationContext != null) {
          SPRING_CONTEXT = applicationContext;
          try {
              // method 是 addListener 方法, 调用该方法用于给 applicationEventMulticaster
              // 添加 listener                                    
              method.invoke(applicationContext, new Object[]{this});
              supportedApplicationListener = true;
          } 
       }
   }     
}
退出移动版