springboot BeanFactoryPostProcesser之ConfigurationClassPostProcessor(四)

ConfigurationClassPostProcessor是所有Bean工厂后置处理器中最先被执行的。下面是他的继承图,实现了BeanDefinitionRegistryPostProcessor和PriorityOrdered。
在这里插入图片描述
上一篇讲到refresh的invokeBeanFactoryPostProcessors方法会依次调用BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry和BeanFactoryPostProcesser的postProcessBeanFactory方法。

ConfigurationClassPostProcessor的postProcessBeanDefinitionRegistry方法内部调用了processConfigBeanDefinitions。主要作用是拿到BeanFactory中所有的BeanDefinition信息,解析加载处理。

public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {
   
		List<BeanDefinitionHolder> configCandidates = new ArrayList<>();
		//拿到registry注册的所有的bean
		String[] candidateNames = registry.getBeanDefinitionNames();

	  //遍历所有的bean,根据BeanName获取BeanDefinition
		for (String beanName : candidateNames) {
   
			BeanDefinition beanDef = registry.getBeanDefinition(beanName);
			if (beanDef.getAttribute(ConfigurationClassUtils.CONFIGURATION_CLASS_ATTRIBUTE) != null) {
   
				if (logger.isDebugEnabled()) {
   
					logger.debug("Bean definition has already been processed as a configuration class: " + beanDef);
				}
			}//判断是否加了@Configuration注解
			else if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.metadataReaderFactory)) {
   
			//把所有的配置类(加了@Configuration)的bean封装成BeanDefinitionHolder加入到集合
				configCandidates.add(new BeanDefinitionHolder(beanDef, beanName));
			}
		}
		//没有配置类直接返回
		// Return immediately if no @Configuration classes were found
		if (configCandidates.isEmpty()) {
   
			return;
		}
		
		//按照order的顺序排序
		// Sort by previously determined @Order value, if applicable
		configCandidates.sort((bd1, bd2) -> {
   
			int i1 = ConfigurationClassUtils.getOrder(bd1.getBeanDefinition());
			int i2 = ConfigurationClassUtils.getOrder(bd2.getBeanDefinition());
			return Integer.compare(i1, i2);
		});

		// Detect any custom bean name generation strategy supplied through the enclosing application context
		SingletonBeanRegistry sbr = null;
		if (registry instanceof SingletonBeanRegistry) {
   
			sbr = (SingletonBeanRegistry) registry;
			if (!this.localBeanNameGeneratorSet) {
   
				BeanNameGenerator generator = (BeanNameGenerator) sbr.getSingleton(
						AnnotationConfigUtils.CONFIGURATION_BEAN_NAME_GENERATOR);
				if (generator != null) {
   
					this.componentScanBeanNameGenerator = generator;
					this.importBeanNameGenerator = generator;
				}
			}
		}

		if (this.environment == null) {
   
			this.environment = new StandardEnvironment();
		}

		//解析每一个@Configuration配置类
		// Parse each @Configuration class
		ConfigurationClassParser parser = new ConfigurationClassParser(
				this.metadataReaderFactory, this.problemReporter, this.environment,
				this.resourceLoader, this.componentScanBeanNameGenerator, registry);

		//存放所有的BeanDefinitionHolder
		Set<BeanDefinitionHolder> candidates = new LinkedHashSet<>(configCandidates);
		//存放已经处理过的Bean的ConfigurationClass
		Set<ConfigurationClass> alreadyParsed = new HashSet<>(configCandidates.size());
		//循环处理BeanDefinition
		do {
   
			StartupStep processConfig = this.applicationStartup.start("spring.context.config-classes.parse");
			//解析BeanDefinition
			**parser.parse(candidates);**
			parser.validate();

			//拿到解析后的BeanDefinition的class
			Set<ConfigurationClass
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值