【Spring-3】ConfigurationClassPostProcessor解析配置类

通过ConfigurationClassPostProcessor处理器,将我们自己编写的类注册到IOC容器中。

直接看方法org.springframework.context.annotation.ConfigurationClassPostProcessor#postProcessBeanDefinitionRegistry

	@Override
	public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
   
		// 这玩意应该是方法重复执行方法的,只能执行一次。
		int registryId = System.identityHashCode(registry);
		if (this.registriesPostProcessed.contains(registryId)) {
   
			throw new IllegalStateException(
					"postProcessBeanDefinitionRegistry already called on this post-processor against " + registry);
		}
		if (this.factoriesPostProcessed.contains(registryId)) {
   
			throw new IllegalStateException(
					"postProcessBeanFactory already called on this post-processor against " + registry);
		}
		this.registriesPostProcessed.add(registryId);

		processConfigBeanDefinitions(registry);
	}

ConfigurationClassPostProcessor#processConfigBeanDefinitions,见名知意,处理配置bd.

	public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {
   
		List<BeanDefinitionHolder> configCandidates = new ArrayList<>();
		// 得到目前为止,所有注册的bd.
		String[] candidateNames = registry.getBeanDefinitionNames();

		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);
				}
			}
			// 从中筛选出符合要求的。什么是符合要求的呢?单独分析
			else if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.metadataReaderFactory)) {
   
				configCandidates.add(new BeanDefinitionHolder(beanDef, beanName));
			}
		}

		// 目前为止筛选出所有@Configuration的bd.



		// Return immediately if no @Configuration classes were found
		if (configCandidates.isEmpty()) {
   
			return;
		}

		// 进行了排序操作。
		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();
		}

		// 创建配置类解析器。
		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 {
   
			// 解析配置类集合
			// 这里的解析是指解析配置类中的注解,然后解析为ConfigurationClass实例中属性信息
			parser.parse(candidates);
			parser.validate();
			
			// 得到所有的配置类信息
			Set<ConfigurationClass> configClasses = new LinkedHashSet<>(parser.getConfigurationClasses());
			configClasses.removeAll(alreadyParsed);

			// Read the model and create bean definitions based on its content
			if (this.reader == null) {
   
				this.reader = new ConfigurationClassBeanDefinitionReader(
						registry, this.sourceExtractor, this.resourceLoader, this.environment,
						this.importBeanNameGenerator, parser.getImportRegistry());
			}
			// 将这些配置类信息,变为bd中的信息,注册到ioc容器中
			this.reader.loadBeanDefinitions(configClasses);
			alreadyParsed.addAll(configClasses);

			candidates.clear();	
			
			// 这里的循环,就是做到完全解析,没有漏掉的
			
			if (registry.getBeanDefinitionCount() > candidateNames.length) 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值