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;
          } 
       }
   }     
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理