spring 源码笔记 启动过程(七) invokeBeanFactoryPostProcessors(beanFactory)

第七步:invokeBeanFactoryPostProcessors(beanFactory)

invokeBeanFactoryPostProcessors(beanFactory)调用链

main:9, AnnotationConfigApplication (com.tbryant.springtest)
refresh:535, AbstractApplicationContext (org.springframework.context.support)
本文主角invokeBeanFactoryPostProcessors方法
invokeBeanFactoryPostProcessors:717, AbstractApplicationContext (org.springframework.context.support)
invokeBeanFactoryPostProcessors:118, PostProcessorRegistrationDelegate (org.springframework.context.support)
invokeBeanDefinitionRegistryPostProcessors:299, PostProcessorRegistrationDelegate (org.springframework.context.support)

(重要)PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors
	public static void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
		if (beanFactory instanceof BeanDefinitionRegistry) {
			// 执行程序员通过API:context.addBeanFactoryPostProcessor()添加的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法 start
			for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
				if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
					registryProcessor.postProcessBeanDefinitionRegistry(registry);
				}
			}// end
			// 执行实现PriorityOrdered接口的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法 start
			for (String ppName : postProcessorNames) {
				if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
					currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
				}
			}			
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);// end
			// 执行实现Ordered接口的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法 start
			for (String ppName : postProcessorNames) {
				if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
					currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
				}
			}
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);// end
			// 执行其他所有(自定义)BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法 start
			boolean reiterate = true;
			while (reiterate) {
				reiterate = false;
				for (String ppName : postProcessorNames) {
					if (!processedBeans.contains(ppName)) {
						currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
						reiterate = true;
					}
				}
				invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
			}// end
			// 执行其他所有(自定义)BeanDefinitionRegistryPostProcessor的postProcessBeanFactory方法
			invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
			// 执行程序员通过API:context.addBeanFactoryPostProcessor()添加的BeanFactoryPostProcessors的postProcessBeanFactory方法
			invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
		}
		// 执行实现PriorityOrdered接口的BeanFactoryPostProcessor的postProcessBeanFactory方法
		invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
		// 执行实现Ordered接口的BeanFactoryPostProcessor的postProcessBeanFactory方法
		invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
		// 执行其他所有BeanFactoryPostProcessor的postProcessBeanFactory方法
		invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
	}
  1. 执行程序员通过API:context.addBeanFactoryPostProcessor()添加的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法
  2. 执行实现PriorityOrdered接口的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法
  3. 执行实现Ordered接口的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法
  4. 执行其他所有(自定义)BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法
  5. 执行其他所有(自定义)BeanDefinitionRegistryPostProcessor的postProcessBeanFactory方法
  6. 执行程序员通过API:context.addBeanFactoryPostProcessor()添加的BeanFactoryPostProcessors的postProcessBeanFactory方法
  7. 执行实现PriorityOrdered接口的BeanFactoryPostProcessor的postProcessBeanFactory方法
  8. 执行实现Ordered接口的BeanFactoryPostProcessor的postProcessBeanFactory方法
  9. 执行其他所有BeanFactoryPostProcessor的postProcessBeanFactory方法

debug源码
第二步执行ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry方法
第五步执行ConfigurationClassPostProcessor.postProcessBeanFactory方法
第九步执行EventListenerMethodProcessor.postProcessBeanFactory方法

执行ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry方法

postProcessBeanDefinitionRegistry:238, ConfigurationClassPostProcessor (org.springframework.context.annotation)
processConfigBeanDefinitions:328, ConfigurationClassPostProcessor (org.springframework.context.annotation)

ConfigurationClassPostProcessor.processConfigBeanDefinitions

	public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {
		// 遍历BeanDefinitionMap判断是否有配置类,没有直接return start
		for (String beanName : candidateNames) {
			if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.metadataReaderFactory)) {
				configCandidates.add(new BeanDefinitionHolder(beanDef, beanName));
			}
		}
		if (configCandidates.isEmpty()) {
			return;
		}// end
		// 实例化解析器
		ConfigurationClassParser parser = new ConfigurationClassParser(this.metadataReaderFactory, this.problemReporter, this.environment, this.resourceLoader, this.componentScanBeanNameGenerator, registry);
		// 解析配置类,处理annotation风格注册的Bean
		parser.parse(candidates);
		// 注册其他风格的Bean
		this.reader.loadBeanDefinitions(configClasses);
	}
  1. 遍历BeanDefinitionMap判断是否有配置类,没有直接return
  2. 解析配置类,处理annotation风格注册的Bean
  3. 注册其他风格的Bean

解析配置类,处理annotation风格注册的Bean

parse:168, ConfigurationClassParser (org.springframework.context.annotation)
parse:200, ConfigurationClassParser (org.springframework.context.annotation)
processConfigurationClass:243, ConfigurationClassParser (org.springframework.context.annotation)
doProcessConfigurationClass:288, ConfigurationClassParser (org.springframework.context.annotation)
parse:131, ComponentScanAnnotationParser (org.springframework.context.annotation)
doScan:276, ClassPathBeanDefinitionScanner (org.springframework.context.annotation)

ClassPathBeanDefinitionScanner.doScan
	protected Set<BeanDefinitionHolder> doScan(String... basePackages) {
		for (String basePackage : basePackages) {
			// 扫描、解析、生成BeanDefinition
			Set<BeanDefinition> candidates = findCandidateComponents(basePackage);
			for (BeanDefinition candidate : candidates) {
				// 验证
				if (checkCandidate(beanName, candidate)) {
					// 注册到BeanDefinitionMap
					registerBeanDefinition(definitionHolder, this.registry);
				}
			}
		}
	}

这个方法是annotation风格注册Bean的核心,包含扫描、解析、验证、注册等步骤。

ClassPathScanningCandidateComponentProvider.findCandidateComponents

findCandidateComponents:315, ClassPathScanningCandidateComponentProvider (org.springframework.context.annotation)
scanCandidateComponents:416, ClassPathScanningCandidateComponentProvider (org.springframework.context.annotation)

ClassPathScanningCandidateComponentProvider.scanCandidateComponents
	private Set<BeanDefinition> scanCandidateComponents(String basePackage) {
		// 拼接扫描规则
		String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + resolveBasePackage(basePackage) + '/' + this.resourcePattern;
		// 拿到所有.class文件
		Resource[] resources = getResourcePatternResolver().getResources(packageSearchPath);
		for (Resource resource : resources) {
			// 解析.class文件
			MetadataReader metadataReader = getMetadataReaderFactory().getMetadataReader(resource);
			// 判断是否加了@Component注解
			if (isCandidateComponent(metadataReader)) {
				// annotation风格注册的Bean会解析成ScannedGenericBeanDefinition
				ScannedGenericBeanDefinition sbd = new ScannedGenericBeanDefinition(metadataReader);
			}
		}		
	}

处理其他风格注册的Bean

回到ConfigurationClassPostProcessor.processConfigBeanDefinitions

	public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {
		// 以上分析的是这个方法
		parser.parse(candidates);
		// 下面分析这个方法
		this.reader.loadBeanDefinitions(configClasses);
	}
ConfigurationClassBeanDefinitionReader.loadBeanDefinitions

loadBeanDefinitions:117, ConfigurationClassBeanDefinitionReader (org.springframework.context.annotation)
loadBeanDefinitionsForConfigurationClass:141, ConfigurationClassBeanDefinitionReader (org.springframework.context.annotation)

ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass
	private void loadBeanDefinitionsForConfigurationClass(ConfigurationClass configClass, TrackedConditionEvaluator trackedConditionEvaluator) {
		// 遍历@Bean注解的方法,注册BeanDefinition
		for (BeanMethod beanMethod : configClass.getBeanMethods()) {
			loadBeanDefinitionsForBeanMethod(beanMethod);
		}
		// 解析@ImportResource,解析XML
		loadBeanDefinitionsFromImportedResources(configClass.getImportedResources());
	}
  1. 遍历@Bean注解的方法,处理java config风格注册的Bean
  2. 解析@ImportResource,处理XML风格注册的Bean
处理java config风格注册的Bean

ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod

	private void loadBeanDefinitionsForBeanMethod(BeanMethod beanMethod) {
		// java config风格注册的Bean会解析成ConfigurationClassBeanDefinition
		ConfigurationClassBeanDefinition beanDef = new ConfigurationClassBeanDefinition(configClass, metadata);
		// 注册到BeanDefinitionMap
		this.registry.registerBeanDefinition(beanName, beanDefToRegister);
	}

这个方法是java config风格注册Bean的核心,包含解析、验证、注册等步骤。

处理XML风格注册的Bean

回到ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromImportedResources
loadBeanDefinitionsFromImportedResources:326, ConfigurationClassBeanDefinitionReader (org.springframework.context.annotation)
forEach:684, LinkedHashMap (java.util)
accept:-1, 911312317 (org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader$$Lambda 22 ) l a m b d a 22) lambda loadBeanDefinitionsFromImportedResources$0:359, ConfigurationClassBeanDefinitionReader (org.springframework.context.annotation)
loadBeanDefinitions:195, AbstractBeanDefinitionReader (org.springframework.beans.factory.support)
loadBeanDefinitions:224, AbstractBeanDefinitionReader (org.springframework.beans.factory.support)
loadBeanDefinitions:188, AbstractBeanDefinitionReader (org.springframework.beans.factory.support)
loadBeanDefinitions:305, XmlBeanDefinitionReader (org.springframework.beans.factory.xml)
loadBeanDefinitions:337, XmlBeanDefinitionReader (org.springframework.beans.factory.xml)
doLoadBeanDefinitions:395, XmlBeanDefinitionReader (org.springframework.beans.factory.xml)

XmlBeanDefinitionReader.doLoadBeanDefinitions
	protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource)
			throws BeanDefinitionStoreException {
			// 加载XML文件
			Document doc = doLoadDocument(inputSource, resource);
			// 解析、验证、注册BeanDefinition
			int count = registerBeanDefinitions(doc, resource);
	}

XML风格注册的Bean会解析成GenericBeanDefinition

执行ConfigurationClassPostProcessor.postProcessBeanFactory方法

// TODO

执行EventListenerMethodProcessor.postProcessBeanFactory方法

// TODO

发布了14 篇原创文章 · 获赞 3 · 访问量 872

猜你喜欢

转载自blog.csdn.net/qq_37956177/article/details/103679199
今日推荐