publicvoidenhanceConfigurationClasses(ConfigurableListableBeanFactorybeanFactory){Map<String,AbstractBeanDefinition>configBeanDefs=newLinkedHashMap<String,AbstractBeanDefinition>();for(StringbeanName:beanFactory.getBeanDefinitionNames()){BeanDefinitionbeanDef=beanFactory.getBeanDefinition(beanName);//判断是否被@Configuration标注if(ConfigurationClassUtils.isFullConfigurationClass(beanDef)){if(!(beanDefinstanceofAbstractBeanDefinition)){thrownewBeanDefinitionStoreException("Cannot enhance @Configuration bean definition '"+beanName+"' since it is not stored in an AbstractBeanDefinition subclass");}elseif(logger.isWarnEnabled()&&beanFactory.containsSingleton(beanName)){logger.warn("Cannot enhance @Configuration bean definition '"+beanName+"' since its singleton instance has been created too early. The typical cause "+"is a non-static @Bean method with a BeanDefinitionRegistryPostProcessor "+"return type: Consider declaring such methods as 'static'.");}configBeanDefs.put(beanName,(AbstractBeanDefinition)beanDef);}}if(configBeanDefs.isEmpty()){// nothing to enhance -> return immediatelyreturn;}ConfigurationClassEnhancerenhancer=newConfigurationClassEnhancer();for(Map.Entry<String,AbstractBeanDefinition>entry:configBeanDefs.entrySet()){AbstractBeanDefinitionbeanDef=entry.getValue();// If a @Configuration class gets proxied, always proxy the target classbeanDef.setAttribute(AutoProxyUtils.PRESERVE_TARGET_CLASS_ATTRIBUTE,Boolean.TRUE);try{// Set enhanced subclass of the user-specified bean classClass<?>configClass=beanDef.resolveBeanClass(this.beanClassLoader);//生成代理的classClass<?>enhancedClass=enhancer.enhance(configClass,this.beanClassLoader);if(configClass!=enhancedClass){if(logger.isDebugEnabled()){logger.debug(String.format("Replacing bean definition '%s' existing class '%s' with "+"enhanced class '%s'",entry.getKey(),configClass.getName(),enhancedClass.getName()));}//替换class,将原来的替换为CGLIB代理的classbeanDef.setBeanClass(enhancedClass);}}catch(Throwableex){thrownewIllegalStateException("Cannot load configuration class: "+beanDef.getBeanClassName(),ex);}}}
//是否为配置类publicstaticbooleanisConfigurationCandidate(AnnotationMetadatametadata){return(isFullConfigurationCandidate(metadata)||isLiteConfigurationCandidate(metadata));}//是否为完整配置类publicstaticbooleanisFullConfigurationCandidate(AnnotationMetadatametadata){returnmetadata.isAnnotated(Configuration.class.getName());}//是否为精简配置类publicstaticbooleanisLiteConfigurationCandidate(AnnotationMetadatametadata){// Do not consider an interface or an annotation...if(metadata.isInterface()){returnfalse;}// Any of the typical annotations found?for(Stringindicator:candidateIndicators){if(metadata.isAnnotated(indicator)){returntrue;}}// Finally, let's look for @Bean methods...try{returnmetadata.hasAnnotatedMethods(Bean.class.getName());}catch(Throwableex){if(logger.isDebugEnabled()){logger.debug("Failed to introspect @Bean methods on class ["+metadata.getClassName()+"]: "+ex);}returnfalse;}}//精简配置类包含的注解static{candidateIndicators.add(Component.class.getName());candidateIndicators.add(ComponentScan.class.getName());candidateIndicators.add(Import.class.getName());candidateIndicators.add(ImportResource.class.getName());}