Spring-ConfigurationClassPostProcessor类

基础设施类,由于继承了BeanDefinitionRegistryPostProcessor接口,所以在此处主要讨论两个接口方法,按照方法优先执行顺序

postProcessBeanDefinitionRegistry方法

这其中又调用了下面的方法
1.processConfigBeanDefinitions方法,代码部分有很多删减,我只记录我认为重要的

public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {
		List<BeanDefinitionHolder> configCandidates = new ArrayList<BeanDefinitionHolder>();
		//获取容器中所有的bean名字
		String[] candidateNames = registry.getBeanDefinitionNames();
		//省略N多代码,for里主要做的就是判断是否是configuration class
		//如果是,则把这个bean放到configCandidates中
		for (String beanName : candidateNames) {
			if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.metadataReaderFactory)) {
				configCandidates.add(new BeanDefinitionHolder(beanDef, beanName));
			}
		}
		if (configCandidates.isEmpty()) {
			return;
		}
		// 根据@Over里的值进行个排序,调用Collections.sort
		// 此处省略排序代码Collections.sort
		
		// 继续解释下面的代码
		SingletonBeanRegistry sbr = null;
		// 如果当前的BeanDefinitionRegistry是SingletonBeanRegistry
		if (registry instanceof SingletonBeanRegistry) {
			sbr = (SingletonBeanRegistry) registry;
			//此处代码未知,因为从我跟踪源码,没有代码能进入到这个if,看注释写的是
			//判断是否有通过手动注册的bean也叫这个名字
			if (!this.localBeanNameGeneratorSet && sbr.containsSingleton(CONFIGURATION_BEAN_NAME_GENERATOR)) {
				BeanNameGenerator generator = (BeanNameGenerator) sbr.getSingleton(CONFIGURATION_BEAN_NAME_GENERATOR);
				this.componentScanBeanNameGenerator = generator;
				this.importBeanNameGenerator = generator;
			}
		}

		// 接下来将每个BeanDefinitionHolder都转换成ConfigurationClass
		// 首先new一个ConfigurationClassParser
		ConfigurationClassParser parser = new ConfigurationClassParser(
				this.metadataReaderFactory, this.problemReporter, this.environment,
				this.resourceLoader, this.componentScanBeanNameGenerator, registry);

		Set<BeanDefinitionHolder> candidates = new LinkedHashSet<BeanDefinitionHolder>(configCandidates);
		Set<ConfigurationClass> alreadyParsed = new HashSet<ConfigurationClass>(configCandidates.size());
		do {
			//在此处将BeanDefinitionHolder都转换成ConfigurationClass
			//并且给变量configClasses,此处省略部分代码
			parser.parse(candidates);
			Set<ConfigurationClass> configClasses = new LinkedHashSet<ConfigurationClass>(parser.getConfigurationClasses());

			// 将所有的configClasses都封装成BeanDefinition,如果此时
			// configClasses是与AOP相关,则创建AOP核心处理类,AnnotationAwareAspectJAutoProxyCreator,并注入到容器中
			// 此处省略部分代码
			this.reader.loadBeanDefinitions(configClasses);
			alreadyParsed.addAll(configClasses);

			candidates.clear();
			// 承接上文,如果容器中多出了一个类(上文中是AnnotationAwareAspectJAutoProxyCreator),那么找到这个类,下面删了很多代码
			if (registry.getBeanDefinitionCount() > candidateNames.length) {
				for (String candidateName : newCandidateNames) {
						//省略了很多代码,下面判断找到的这个累如果是configurationClass,则包装成BeanDefinitionHolder
						if (ConfigurationClassUtils.checkConfigurationClassCandidate(bd, this.metadataReaderFactory) &&!alreadyParsedClasses.contains(bd.getBeanClassName())) {
							candidates.add(new BeanDefinitionHolder(bd, candidateName));
						}
				}
				candidateNames = newCandidateNames;
			}
		}
		while (!candidates.isEmpty());

		// Register the ImportRegistry as a bean in order to support ImportAware @Configuration classes
		if (sbr != null) {
			// 判断是否BeanDefinitionRegistry包含一个叫importRegistry的bean,不包含就注册一个,目前我并不知道这个bean是做什么用的
			if (!sbr.containsSingleton(IMPORT_REGISTRY_BEAN_NAME)) {
				sbr.registerSingleton(IMPORT_REGISTRY_BEAN_NAME, parser.getImportRegistry());
			}
		}
		//清空缓存,目前我并不知道做什么的,没仔细看,应该是用来做局部变量保存的,完事儿之后就清空了
		if (this.metadataReaderFactory instanceof CachingMetadataReaderFactory) {
			((CachingMetadataReaderFactory) this.metadataReaderFactory).clearCache();
		}
	}

postProcessBeanFactory

发布了157 篇原创文章 · 获赞 26 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/u011624903/article/details/102535422