Spring源码解读---(三、SpringMVC容器以注解方式加载Bean,以SpringBoot的main.run为切入点)

记录下SpringMVC容器以注解的方式加载Bean的堆栈调用,做个笔记,其中一些更深层次的内容以后再探究:

1、SpringApplication类

  public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args)方法的:

                       return (new SpringApplication(primarySources)).run(args)

2、SpringApplication类

  ConfigurableApplicationContext run(String... args) 方法的:

        this.refreshContext(context);

3、SpringApplication类

         private void refreshContext(ConfigurableApplicationContext context)的

                       this.refresh(context);

4、SpringApplication类

       protected void refresh(ApplicationContext applicationContext)的

            ((AbstractApplicationContext)applicationContext).refresh();

5、AbstractApplicationContext类

          public void refresh() throws BeansException, IllegalStateException 的

                  this.invokeBeanFactoryPostProcessors(beanFactory);

          //        this.postProcessBeanFactory(beanFactory);
         //       this.invokeBeanFactoryPostProcessors(beanFactory);
         //     this.registerBeanPostProcessors(beanFactory);
         //   this.initMessageSource();
         //       this.initApplicationEventMulticaster();
         //       this.onRefresh();
         //       this.registerListeners();
         //       this.finishBeanFactoryInitialization(beanFactory);
         //       this.finishRefresh();

其中this.finishBeanFactoryInitialization(beanFactory)完成在this.invokeBeanFactoryPostProcessors(beanFactory)加载的Beandefinition的实例化

6、AbstractApplicationContext类

          protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory)的

          PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, this.getBeanFactoryPostProcessors());

7、PostProcessorRegistrationDelegate类

      public static void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors)的:

          invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);

8、PostProcessorRegistrationDelegate类

    private static void invokeBeanDefinitionRegistryPostProcessors(Collection<? extends BeanDefinitionRegistryPostProcessor> postProcessors, BeanDefinitionRegistry registry)的:

       postProcessor.postProcessBeanDefinitionRegistry(registry);

9、ConfigurationClassPostProcessor类

         public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)的

               this.processConfigBeanDefinitions(registry);

10、ConfigurationClassPostProcessor类

         public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) 的:

             parser.parse(candidates);

11、ConfigurationClassParser类

          public void parse(Set<BeanDefinitionHolder> configCandidates)的

              if(bd instanceof AnnotatedBeanDefinition) {
                    this.parse(((AnnotatedBeanDefinition)bd).getMetadata(), holder.getBeanName());
                }

12、ConfigurationClassParser类

         protected final void parse(AnnotationMetadata metadata, String beanName) throws IOException

            this.processConfigurationClass(new ConfigurationClass(metadata, beanName));

13、ConfigurationClassParser类

                     sourceClass = this.doProcessConfigurationClass(configClass, sourceClass);

  14、ConfigurationClassParser类

             Set<BeanDefinitionHolder> scannedBeanDefinitions = this.componentScanParser.parse(componentScan, sourceClass.getMetadata().getClassName());

15、ComponentScanAnnotationParser类

          return scanner.doScan(StringUtils.toStringArray(basePackages));

16、ClassPathBeanDefinitionScanner类

            Set<BeanDefinition> candidates = this.findCandidateComponents(basePackage);

17、ClassPathScanningCandidateComponentProvider类

          this.scanCandidateComponents(basePackage);

18、ClassPathScanningCandidateComponentProvider类

            

private Set<BeanDefinition> scanCandidateComponents(String basePackage) {
        LinkedHashSet candidates = new LinkedHashSet();

        try {
            String packageSearchPath = "classpath*:" + this.resolveBasePackage(basePackage) + '/' + this.resourcePattern;
            Resource[] resources = this.getResourcePatternResolver().getResources(packageSearchPath);
            boolean traceEnabled = this.logger.isTraceEnabled();
            boolean debugEnabled = this.logger.isDebugEnabled();
            Resource[] var7 = resources;
            int var8 = resources.length;

            for(int var9 = 0; var9 < var8; ++var9) {
                Resource resource = var7[var9];
                if(traceEnabled) {
                    this.logger.trace("Scanning " + resource);
                }

                if(resource.isReadable()) {
                    try {
                        MetadataReader metadataReader = this.getMetadataReaderFactory().getMetadataReader(resource);
                        if(this.isCandidateComponent(metadataReader)) {
                            ScannedGenericBeanDefinition sbd = new ScannedGenericBeanDefinition(metadataReader);
                            sbd.setResource(resource);
                            sbd.setSource(resource);
                            if(this.isCandidateComponent((AnnotatedBeanDefinition)sbd)) {
                                if(debugEnabled) {
                                    this.logger.debug("Identified candidate component class: " + resource);
                                }

                                candidates.add(sbd);
                            } else if(debugEnabled) {
                                this.logger.debug("Ignored because not a concrete top-level class: " + resource);
                            }
                        } else if(traceEnabled) {
                            this.logger.trace("Ignored because not matching any filter: " + resource);
                        }
                    } catch (Throwable var13) {
                        throw new BeanDefinitionStoreException("Failed to read candidate component class: " + resource, var13);
                    }
                } else if(traceEnabled) {
                    this.logger.trace("Ignored because not readable: " + resource);
                }
            }

            return candidates;
        } catch (IOException var14) {
            throw new BeanDefinitionStoreException("I/O failure during classpath scanning", var14);
        }
    }

                

         

猜你喜欢

转载自blog.csdn.net/qq_25179481/article/details/89284135