PostProcessorRegistrationDelegate class public static void invokeBeanFactoryPostProcessors( ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) { ··· // Invoke BeanDefinitionRegistryPostProcessors first, if any. if (beanFactory instanceof BeanDefinitionRegistry) { BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory; List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered. String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); // (1) for (String ppName : postProcessorNames) { if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); // (2) } } sortPostProcessors(currentRegistryProcessors, beanFactory); // 将@Configuration类生成BeanDefinition,此时的BeanDefinition.beanClass为原类class对象 invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry); // (3)
// Now, invoke the postProcessBeanFactory callback of all processors handled so far. // 将(3)处的BeanDefinition.beanClass赋值为proxy代理类 nvokeBeanFactoryPostProcessors(registryProcessors, beanFactory);(4) } ··· }
ConfigurationClassPostProcessor class @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) { processConfigBeanDefinitions(registry); }
ConfigurationClassPostProcessor class public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) { List<BeanDefinitionHolder> configCandidates = new ArrayList<>(); String[] candidateNames = registry.getBeanDefinitionNames();
for (String beanName : candidateNames) { BeanDefinition beanDef = registry.getBeanDefinition(beanName); if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.metadataReaderFactory)){ configCandidates.add(new BeanDefinitionHolder(beanDef, beanName));//(1) } } ··· 排序等 s // Parse each @Configuration class ConfigurationClassParser parser = new ConfigurationClassParser( this.metadataReaderFactory, this.problemReporter, this.environment, this.resourceLoader, this.componentScanBeanNameGenerator, registry);
Set<BeanDefinitionHolder> candidates = new LinkedHashSet<>(configCandidates); Set<ConfigurationClass> alreadyParsed = new HashSet<>(configCandidates.size()); do { parser.parse(candidates); //(2) parser.validate();
Set<ConfigurationClass> configClasses = new LinkedHashSet<>(parser.getConfigurationClasses()); // Read the model and create bean definitions based on its content this.reader = new ConfigurationClassBeanDefinitionReader( registry, this.sourceExtractor, this.resourceLoader, this.environment, this.importBeanNameGenerator, parser.getImportRegistry()); this.reader.loadBeanDefinitions(configClasses); //(3) } while (!candidates.isEmpty()); ··· ··· }
// Recursively process the configuration class and its superclass hierarchy. SourceClass sourceClass = asSourceClass(configClass); do { sourceClass = doProcessConfigurationClass(configClass, sourceClass); } while (sourceClass != null);
protected final SourceClass doProcessConfigurationClass(ConfigurationClass configClass, SourceClass sourceClass){ // 为了集中说明意图,隐藏了代码 // Recursively process any member (nested) classes first // Process any @PropertySource annotations // Process any @ComponentScan annotations for (AnnotationAttributes componentScan : componentScans) { for (BeanDefinitionHolder holder : scannedBeanDefinitions) { if () { // 进入递归调用 parse(bdCand.getBeanClassName(), holder.getBeanName()); } } }
// Process any @Import annotations // Process any @ImportResource annotations // Process individual @Bean methods // Process default methods on interfaces // Process superclass, if any // No superclass -> processing is complete return null; }
实现自BeanFactoryPostProcessor.postProcessBeanFactory ConfigurationClassPostProcessor class @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { // 生成代理 enhanceConfigurationClasses(beanFactory); beanFactory.addBeanPostProcessor(new ImportAwareBeanPostProcessor(beanFactory)); }
ConfigurationClassPostProcessor.ConfigurationClassEnhancer class public void enhanceConfigurationClasses(ConfigurableListableBeanFactory beanFactory) { Map<String, AbstractBeanDefinition> configBeanDefs = new LinkedHashMap<>(); for (String beanName : beanFactory.getBeanDefinitionNames()) { BeanDefinition beanDef = beanFactory.getBeanDefinition(beanName); if (ConfigurationClassUtils.isFullConfigurationClass(beanDef)) { if (!(beanDef instanceof AbstractBeanDefinition)) { throw } configBeanDefs.put(beanName, (AbstractBeanDefinition) beanDef); } }
ConfigurationClassEnhancer enhancer = new ConfigurationClassEnhancer(); for (Map.Entry<String, AbstractBeanDefinition> entry : configBeanDefs.entrySet()) { AbstractBeanDefinition beanDef = entry.getValue(); // If a @Configuration class gets proxied, always proxy the target class beanDef.setAttribute(AutoProxyUtils.PRESERVE_TARGET_CLASS_ATTRIBUTE, Boolean.TRUE); // Set enhanced subclass of the user-specified bean class Class<?> configClass = beanDef.resolveBeanClass(this.beanClassLoader); if (configClass != null) { Class<?> enhancedClass = enhancer.enhance(configClass, this.beanClassLoader); if (configClass != enhancedClass) { beanDef.setBeanClass(enhancedClass); } } } }
ConfigurationClassPostProcessor.ConfigurationClassEnhancer class public Class<?> enhance(Class<?> configClass, @Nullable ClassLoader classLoader) { if (EnhancedConfiguration.class.isAssignableFrom(configClass)) { return configClass; } Class<?> enhancedClass = createClass(newEnhancer(configClass, classLoader)); return enhancedClass; }
v1.5.2