先贴例子:接下来开始分析流程,启动项目,会发现ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry()执行的是我们声明的目标类:图1-2publicvoidprocessConfigBeanDefinitions(BeanDefinitionRegistryregistry){ListconfigCandidates=新数组列表<>();String[]candidateNames=registry.getBeanDefinitionNames();for(StringbeanName:candidateNames){BeanDefinitionbeanDef=registry.getBeanDefinition(beanName);if(ConfigurationClassUtils.isFullConfigurationClass(beanDef)||ConfigurationClassUtils.isLiteConfigurationClass(beanifDef)){(logger.isDebugEnabled()){logger.debug("Bean定义已经作为配置类处理:"+beanDef);}}elseif(ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef,this.metadataReaderFactory)){configCandidates.add(newBeanDefinitionHolder(beanDef,beanName));}}//如果没有找到@Configuration类,则立即返回if(configCandidates.isEmpty()){return;}//按先前确定的@Order值排序,如果适用的话));返回Integer.compare(i1,i2);});//检测通过封闭的应用程序上下文提供的任何自定义bean名称生成策略SingletonBeanRegistrysbr=null;if(registryinstanceofSingletonBeanRegistry){sbr=(SingletonBeanRegistry)注册表;如果(!this.localBeanNameGeneratorSet){BeanNameGenerator生成器=(BeanNameGenerator)sbr.getSingleton(CONFIGURATION_BEAN_NAME_GENERA职权范围);if(generator!=null){this.componentScanBeanNameGenerator=generator;this.importBeanNameGenerator=生成器;}}}if(this.environment==null){this.environment=newStandardEnvironment();}//解析每个@Configuration类//创建ConfigurationClassParser类,用来解析带有@Configuration的类ConfigurationClassParserparser=newConfigurationClassParser(this.metadataReaderFactory,this.problemReporter,this.environment,this.resourceLoader,this.componentScanBeanNameGenerator,registry);Setcandidates=newLinkedHashSet<>(configCandidates);SetalreadyParsed=newHashSet<>(configCandidates.size());do{//执行解析传递parser.parse(candidates);解析器.validate();//保存所有带@Configuration的类SetconfigClasses=newLinkedHashSet<>(parser.getConfigurationClasses());configClasses.removeAll(alreadyParsed);//读取模型并根据其内容创建bean定义if(this.reader==null){//声明@configuration读取类this.reader=newConfigurationClassBeanDefinitionReader(registry,this.sourceExtractor,this.resourceLoader,this.环境,this.importBeanNameGenerator,parser.getImportRegistry());}//加载this.reader.loadBeanDefinitions(configClasses);alreadyParsed.addAll(configClasses);candidates.clear();如果(registry.getBeanDefinitionCount()>candidateNames.length){String[]newCandidateNames=registry.getBeanDefinitionNames();设置oldCandidateNames=newHashSet<>(Arrays.asList(candidateNames));SetalreadyParsedClasses=newHashSet<>();for(ConfigurationClassconfigurationClass:alreadyParsed){alreadyParsedClasses.add(configurationClass.getMetadata().getClassName());}for(StringcandidateName:newCandidateNames){if(!oldCandidateNames.contains(candidateName)){BeanDefinitionbd=registry.getBeanDefinition(candidateName);如果(ConfigurationClassUtils.checkConfigurationClassCandidate(bd,this.metadataReaderFactory)&&!alreadyParsedClasses.contains(bd.getBeanClassName())){candidates.add(newBeanDefinitionHolder(bd,candidateName));}}}candidateNames=newCan指定名称;}}while(!candidates.isEmpty());//将ImportRegistry注册为bean以支持ImportAware@Configuration类}if(this.metadataReaderFactoryinstanceofCachingMetadataReaderFactory){//清除外部提供的MetadataReaderFactory中的缓存;这是共享缓存的无操作//因为它会被ApplicationContext清除。((CachingMetadataReaderFactory)this.metadataReaderFactory).clearCache();}}其中reader.loadBeanDefinitions(configClasses),最终调用loadBeanDefinitionsForConfigurationClass()privatevoidloadBeanDefinitionsForConfigurationClass(ConfigurationClassconfigClass,TrackedConditionEvaluatortrackedConditionEvaluator){for(BeanMethodbeanMethod:configClass.getBeanMethods()){//加载@Configuration类中带有@Bean的方法loadBeanDefinitionsForBeanMethod(beanMethod);}}privatevoidloadBeanDefinitionsForBeanMethod(BeanMethodbeanMethod){//@Bean方法的类,注册在DefaultListBeanFactory的beanDefinitionMap中this.registry.registerBeanDefinition()}DefaultListBeanFactory.registerBeanDefinition();具体细节publicvoidregisterBeanDefinition(StringbeanName,BeanDefinitionbeanDefinition)throwsBeanDefinitionStoreException{BeanDefinitionoldBeanUserDefinition,因为之前的解析器已经解析过了,此时在分析UserConfig中的UserManager时,会发现oldBeanDefinition不为空;oldBeanDefinition=this.beanDefinitionMap.get(beanName);if(oldBeanDefinition!=null){if(!isAllowBeanDefinitionOverriding()){thrownewBeanDefinitionStoreException(beanDefinition.getResourceDescription(),beanName,"无法注册bean定义["+beanDefinition+"]forbean'"+beanName+"':已经有["+oldBeanDefinition+"]绑定。");}elseif(oldBeanDefinition.getRole()