<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Dubbo服務注冊原理

      文章目錄

      • 1注冊步驟
      • 2 猜想:
      • 3源碼分析
        • 3.1 @DubboComponentScan
          • 3.1.1 圖片總結
        • 3.2 DubboBootstrapApplicationListener.java

       

      1注冊步驟

      1. 使用注解@DubboService或@Service
      2. 掃描注解@DubboComponentScan

      2 猜想:

      (1)掃描注解
      (2)組裝url
      (3)啟動服務(根據url中配置的協議、端口去發布對應的服務)
      (4)注冊到注冊中心

      3源碼分析

      3.1 @DubboComponentScan

      @Target({ElementType.TYPE})
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      @Import({DubboComponentScanRegistrar.class})
      public @interface DubboComponentScan {
          String[] value() default {};
      
          String[] basePackages() default {};
      
          Class<?>[] basePackageClasses() default {};
      }
      

      DubboComponentScanRegistrar:動態注冊bean到IOC中,但是是注冊哪個bean?需要分析下源碼

          @Override
          public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
      //獲取@DubboComponentScan注解中配置的包路徑
              Set<String> packagesToScan = getPackagesToScan(importingClassMetadata);
      //注冊bean到IOC容器中
              registerServiceAnnotationBeanPostProcessor(packagesToScan, registry);
      
              // @since 2.7.6 Register the common beans
              registerCommonBeans(registry);
          }
      

      點擊 registerServiceAnnotationBeanPostProcessor(packagesToScan, registry),可以看到將ServiceAnnotationBeanPostProcessor加載到IOC容器中

       private void registerServiceAnnotationBeanPostProcessor(Set<String> packagesToScan, BeanDefinitionRegistry registry) {
      
              BeanDefinitionBuilder builder = rootBeanDefinition(ServiceAnnotationBeanPostProcessor.class);
              builder.addConstructorArgValue(packagesToScan);
              builder.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
              AbstractBeanDefinition beanDefinition = builder.getBeanDefinition();
              BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, registry);
      
          }
      

      來看下 ServiceAnnotationBeanPostProcessor.java

        public ServiceAnnotationBeanPostProcessor(Set<String> packagesToScan) {
              super(packagesToScan);
          }
      

      點擊父類ServiceClassPostProcessor.java的構造器,在bean加載到IOC之后會觸發postProcessBeanDefinitionRegistry方法

      @Override
          public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
      
              // @since 2.7.5
              //注冊基礎bean
              registerInfrastructureBean(registry, DubboBootstrapApplicationListener.BEAN_NAME, DubboBootstrapApplicationListener.class);
      
              Set<String> resolvedPackagesToScan = resolvePackagesToScan(packagesToScan);
                //如果掃描的包路徑不為空,注冊服務bean:serviceBean
              if (!CollectionUtils.isEmpty(resolvedPackagesToScan)) {
                  registerServiceBeans(resolvedPackagesToScan, registry);
              } else {
                  if (logger.isWarnEnabled()) {
                      logger.warn("packagesToScan is empty , ServiceBean registry will be ignored!");
                  }
              }
      
          }
      

      registerInfrastructureBean()方法中將DubboBootstrapApplicationListener注冊到容器中,
      DubboBootstrapApplicationListener中的onApplicationContextEvent()方法會在spring 容器的上下文裝載完成之后,觸發監聽

       @Override
          public void onApplicationContextEvent(ApplicationContextEvent event) {
              if (event instanceof ContextRefreshedEvent) {
                  onContextRefreshedEvent((ContextRefreshedEvent) event);
              } else if (event instanceof ContextClosedEvent) {
                  onContextClosedEvent((ContextClosedEvent) event);
              }
          }
      

      再來看下registerServiceBeans(resolvedPackagesToScan, registry) 代碼
      掃描所有加了@DubboService或@Service注解的bean,但不是注冊到IOC容器里

       private void registerServiceBeans(Set<String> packagesToScan, BeanDefinitionRegistry registry) {
      
             DubboClassPathBeanDefinitionScanner scanner =
                     new DubboClassPathBeanDefinitionScanner(registry, environment, resourceLoader);
      
             BeanNameGenerator beanNameGenerator = resolveBeanNameGenerator(registry);
      
             scanner.setBeanNameGenerator(beanNameGenerator);
      
             // refactor @since 2.7.7
             serviceAnnotationTypes.forEach(annotationType -> {
                 scanner.addIncludeFilter(new AnnotationTypeFilter(annotationType));
             });
      
             for (String packageToScan : packagesToScan) {
      
                 // Registers @Service Bean first
                 scanner.scan(packageToScan);
      
                 // Finds all BeanDefinitionHolders of @Service whether @ComponentScan scans or not.
                 Set<BeanDefinitionHolder> beanDefinitionHolders =
                         findServiceBeanDefinitionHolders(scanner, packageToScan, registry, beanNameGenerator);
      
                 if (!CollectionUtils.isEmpty(beanDefinitionHolders)) {
      
                     for (BeanDefinitionHolder beanDefinitionHolder : beanDefinitionHolders) {
                         registerServiceBean(beanDefinitionHolder, registry, scanner);
                     }
      
                     if (logger.isInfoEnabled()) {
                         logger.info(beanDefinitionHolders.size() + " annotated Dubbo's @Service Components { " +
                                 beanDefinitionHolders +
                                 " } were scanned under package[" + packageToScan + "]");
                     }
      
                 } else {
      
                     if (logger.isWarnEnabled()) {
                         logger.warn("No Spring Bean annotating Dubbo's @Service was found under package["
                                 + packageToScan + "]");
                     }
      
                 }
      
             }
      
         }
      

      點擊 registerServiceBean(beanDefinitionHolder, registry, scanner);

      private void registerServiceBean(BeanDefinitionHolder beanDefinitionHolder, BeanDefinitionRegistry registry,
                                          DubboClassPathBeanDefinitionScanner scanner) {
      
             Class<?> beanClass = resolveClass(beanDefinitionHolder);
      
             Annotation service = findServiceAnnotation(beanClass);
      
             /**
              * The {@link AnnotationAttributes} of @Service annotation
              */
             AnnotationAttributes serviceAnnotationAttributes = getAnnotationAttributes(service, false, false);
      
             Class<?> interfaceClass = resolveServiceInterfaceClass(serviceAnnotationAttributes, beanClass);
      
             String annotatedServiceBeanName = beanDefinitionHolder.getBeanName();
      
             AbstractBeanDefinition serviceBeanDefinition =
                     buildServiceBeanDefinition(service, serviceAnnotationAttributes, interfaceClass, annotatedServiceBeanName);
      
             // ServiceBean Bean name
             String beanName = generateServiceBeanName(serviceAnnotationAttributes, interfaceClass);
      
             if (scanner.checkCandidate(beanName, serviceBeanDefinition)) { // check duplicated candidate bean
                 registry.registerBeanDefinition(beanName, serviceBeanDefinition);
      
                 if (logger.isInfoEnabled()) {
                     logger.info("The BeanDefinition[" + serviceBeanDefinition +
                             "] of ServiceBean has been registered with name : " + beanName);
                 }
      
             } else {
      
                 if (logger.isWarnEnabled()) {
                     logger.warn("The Duplicated BeanDefinition[" + serviceBeanDefinition +
                             "] of ServiceBean[ bean name : " + beanName +
                             "] was be found , Did @DubboComponentScan scan to same package in many times?");
                 }
      
             }
      
         }
      

      buildServiceBeanDefinition

       private AbstractBeanDefinition buildServiceBeanDefinition(Annotation serviceAnnotation,
                                                                   AnnotationAttributes serviceAnnotationAttributes,
                                                                   Class<?> interfaceClass,
                                                                   String annotatedServiceBeanName) {
      
             BeanDefinitionBuilder builder = rootBeanDefinition(ServiceBean.class);
             //省略代碼
      

      最終將org.apache.dubbo.config.spring.ServiceBean注冊到IOC容器中

      3.1.1 圖片總結

      在這里插入圖片描述

      3.2 DubboBootstrapApplicationListener.java

      DubboBootstrapApplicationListener.java實現了監聽接口,最終會調用ServiceConfig#export()方法,調用過程如下圖:
      在這里插入圖片描述

       http://www.exyb.cn/news/show-333.html

      posted @ 2021-05-08 16:21  唯愛編程  閱讀(388)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 虎白女粉嫩尤物福利视频| 日本亚洲一区二区精品久久| 久久精品国产亚洲av成人| 4hu亚洲人成人无码网www电影首页| 精品国产综合一区二区三区| 日本一道一区二区视频| 亚洲欧美综合精品成人网站| 先锋影音av最新资源| 蜜臀av一区二区精品字幕| 国产精品午夜福利精品| 亚洲成人av综合一区| 久热re这里精品视频在线6| 香蕉EEWW99国产精选免费| 全免费A级毛片免费看无码| 欧美成人一卡二卡三卡四卡| 粉嫩国产av一区二区三区| 亚洲av二区伊人久久| 亚洲欧美在线一区中文字幕| 欧美18videosex性欧美tube1080| 亚洲无线码中文字幕在线| 亚洲精品天堂在线观看| 国产亚洲亚洲国产一二区 | 中文字幕午夜福利片午夜福利片97| av无码久久久久不卡网站蜜桃 | 国产成人亚洲无码淙合青草| 亚洲av午夜福利精品一区二区| 久久精品人妻无码一区二区三区| 无码国产一区二区三区四区 | 日照市| 国产一区| 神农架林区| 国产成人综合色就色综合 | 国产综合色在线精品| 亚洲色欲色欱WWW在线| 亚洲国产成人综合自在线| 无码内射中文字幕岛国片| 亚洲一区精品视频在线| 日本久久久久久久做爰片日本| 内射极品少妇xxxxxhd| 瑞丽市| 国产精品不卡一二三区|