Spring注解配置加载解析原理二

本章我们将重点讲解Spring刷新原理

代码如下:

@Override
public void refresh() throws BeansException, IllegalStateException {
   synchronized (this.startupShutdownMonitor) {
	// ⑴.准备刷新的上下文环境
	prepareRefresh();
	// ⑵.初始化BeanFactory
	ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

	// ⑶.对BeanFactory进行各种功能填充
	prepareBeanFactory(beanFactory);

	try {
		// ⑷.子类覆盖方法做额外的处理
		postProcessBeanFactory(beanFactory);

		// ⑸.注册,实例化,调用各种BeanFactory处理器
		invokeBeanFactoryPostProcessors(beanFactory);

		// ⑹.注册拦截Bean创建的Bean处理,这里只是注册,真正调用是再拿去Bean的时候
		registerBeanPostProcessors(beanFactory);
			
		// ⑺.为上下文初始化Message源,即不同语言的消息体,国际化处理
		initMessageSource();

		// ⑻.初始化应用消息广播器,并放到applicationEventMulticaster bean中
		initApplicationEventMulticaster();
			
		// ⑼.留给子类来初始化其他bean
		onRefresh();

		// ⑽.在所有注册的bean中查找Listener bean,注册到消息广播中
		registerListeners();

		// ⑾.初始化剩下的单实例(非惰性)
		finishBeanFactoryInitialization(beanFactory);

		// ⑿.完成刷新过程,通知生命周期处理器lifecycleProcessor刷新过程,同时发出ContextRefreshEvent通知别人
		finishRefresh();
	}

	catch (BeansException ex) {
		if (logger.isWarnEnabled()) {
			logger.warn("Exception encountered during context initialization - " +
					"cancelling refresh attempt: " + ex);
		}

		// Destroy already created singletons to avoid dangling resources.
		destroyBeans();

		// Reset 'active' flag.
		cancelRefresh(ex);

		// Propagate exception to caller.
		throw ex;
	}

	finally {
		// Reset common introspection caches in Spring's core, since we
		// might not ever need metadata for singleton beans anymore...
		resetCommonCaches();
	}
  }	
}

本篇文章重点讲解
⑶.对BeanFactory进行各种功能填充
⑸.注册,实例化,调用各种BeanFactory处理器
⑹.注册拦截Bean创建的Bean处理
⑾.初始化剩下的单实例(非惰性)

1 对BeanFactory进行各种功能填充

2 注册,实例化,调用各种BeanFactory处理器

invokeBeanFactoryPostProcessors()在开始Spring生命周期开始之前做了一系列的初始化,接下来我们将重点讲解。

流程概述

  • ⑴:获取已经注册的BeanDefinitionRegistryPostProcessor子类【时序图1.1】
  • ⑵:获取Spring上下文中含有@Configuration的类。【如时序图1.2】
  • ⑶:处理⑵中获得类进行处理。【如时序图1.3】

时序图如下:
这里写图片描述

2.1 获取已经注册的BeanDefinitionRegistryPostProcessor子类

代码

public static void invokeBeanFactoryPostProcessors(
			ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {

   // 存储执行过得BeanDefinitionRegistryPostProcessor名称
  Set<String> processedBeans = new HashSet<String>();

  // ⑴首先检查在AbstractApplicationContext类中属性BeanFactoryPostProcessors和BeanDefinitionRegistryPostProcessor是否含有数据,如果有进行处理。
  if (beanFactory instanceof BeanDefinitionRegistry) {
	BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
	// 存放BeanFactoryPostProcessors类型的Bean
	List<BeanFactoryPostProcessor> regularPostProcessors = new LinkedList<BeanFactoryPostProcessor>();
	// 存放BeanDefinitionRegistryPostProcessor类型的Bean
	List<BeanDefinitionRegistryPostProcessor> registryPostProcessors =
					new LinkedList<BeanDefinitionRegistryPostProcessor>();

	/**
	* 如果是BeanDefinitionRegistryPostProcessor Bean则调用方法执行,并加到registryPostProcessors属性中,
	* 如果是BeanFactoryPostProcessorsBean直接加到regularPostProcessors 属性中,
	*/
	for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
		if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
			BeanDefinitionRegistryPostProcessor registryPostProcessor =
					(BeanDefinitionRegistryPostProcessor) postProcessor;			
			registryPostProcessor.postProcessBeanDefinitionRegistry(registry);
			registryPostProcessors.add(registryPostProcessor);
		}
		else {	
			regularPostProcessors.add(postProcessor);
		}
	}

	// Do not initialize FactoryBeans here: We need to leave all regular beans
	// uninitialized to let the bean factory post-processors apply to them!
	// Separate between BeanDefinitionRegistryPostProcessors that implement
	// PriorityOrdered, Ordered, and the rest.
	// ⑵ 查找spring上下文中(beanFactory)是否含有BeanDefinitionRegistryPostProcessor的子类,
	//⑵ (此时项目中还没有我们项目中注入的Bean,需要ConfigurationClassPostProcessor去扫描我们的项目,将可以扫描的Bean注入到Spring容器中)
	// ⑵ 找出继承PriorityOrdered的类,进行实例化(执行Spring生命周期)、排序、调用方法,执行过的添加到processedBeans属性中。
	String[] postProcessorNames =
			beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
	List<BeanDefinitionRegistryPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanDefinitionRegistryPostProcessor>();
	for (String ppName : postProcessorNames) {
		 // 找出继承PriorityOrdered的类
		if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
		// 实例化(执行Spring生命周期)
		priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
			processedBeans.add(ppName);
		}
	}
	// 排序
	sortPostProcessors(beanFactory, priorityOrderedPostProcessors);
		
	registryPostProcessors.addAll(priorityOrderedPostProcessors);
	// 调用
	invokeBeanDefinitionRegistryPostProcessors(priorityOrderedPostProcessors, registry);

	// ⑶查找spring上下文中(beanFactory)是否含有BeanDefinitionRegistryPostProcessor的子类,
	// ⑶找出继承Ordered的类,进行实例化(执行Spring生命周期)、排序、调用方法,执行过的添加到processedBeans属性中。
	postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
	List<BeanDefinitionRegistryPostProcessor> orderedPostProcessors = new ArrayList<BeanDefinitionRegistryPostProcessor>();
	for (String ppName : postProcessorNames) {
	// 找出继承Ordered的类
		if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
		   // 实例化(执行Spring生命周期)
			orderedPostProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
			processedBeans.add(ppName);
		}
	}
	// 排序
	sortPostProcessors(beanFactory, orderedPostProcessors);
	// 调用
	registryPostProcessors.addAll(orderedPostProcessors);
	invokeBeanDefinitionRegistryPostProcessors(orderedPostProcessors, registry);

	// ⑷ 查找spring上下文中(beanFactory)是否含有BeanDefinitionRegistryPostProcessor的子类,
	// ⑷ 找出步骤3步骤4没有执行的Bean,进行实例化(执行Spring生命周期)、排序、调用方法,执行过的添加到processedBeans属性中,(此时会找到我们)。
	boolean reiterate = true;
	while (reiterate) {
		reiterate = false;
		postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
		for (String ppName : postProcessorNames) {
			if (!processedBeans.contains(ppName)) {
			// 实例化(执行Spring生命周期)
				BeanDefinitionRegistryPostProcessor pp = beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class);
				registryPostProcessors.add(pp);
				processedBeans.add(ppName);
				// 调用
				pp.postProcessBeanDefinitionRegistry(registry);
				reiterate = true;
			}
		}
	}

	// ⑸ 处理registryPostProcessors集合中BeanDefinitionRegistryPostProcessor类的postProcessBeanFactory方法。
	invokeBeanFactoryPostProcessors(registryPostProcessors, beanFactory);
	// ⑸ 处理regularPostProcessors集合中BeanFactoryPostProcessor类的postProcessBeanFactory。
	// ⑸ regularPostProcessors属性存放的是项目启动时AbstractApplicationContext手动添加的BeanFactoryPostProcessor
	invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
  }

  else {// ⑹ 处理beanFactoryPostProcessors子类。具体流程和上面差不多
	// Invoke factory processors registered with the context instance.
	invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
  }

  // Do not initialize FactoryBeans here: We need to leave all regular beans
  // uninitialized to let the bean factory post-processors apply to them!
  String[] postProcessorNames =
	beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);

  // Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
  // Ordered, and the rest.
  List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();
  List<String> orderedPostProcessorNames = new ArrayList<String>();
  List<String> nonOrderedPostProcessorNames = new ArrayList<String>();
   for (String ppName : postProcessorNames) {
	if (processedBeans.contains(ppName)) {
		// skip - already processed in first phase above
	}
	else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
		priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
	}
	else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
		orderedPostProcessorNames.add(ppName);
	}
	else {
		nonOrderedPostProcessorNames.add(ppName);
	}
  }

  // First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
  sortPostProcessors(beanFactory, priorityOrderedPostProcessors);
   invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);

   // Next, invoke the BeanFactoryPostProcessors that implement Ordered.
   List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();
  for (String postProcessorName : orderedPostProcessorNames) {
	orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
  }
  sortPostProcessors(beanFactory, orderedPostProcessors);
  invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);

  // Finally, invoke all other BeanFactoryPostProcessors.
  List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();
  for (String postProcessorName : nonOrderedPostProcessorNames) {
	nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
  }
 invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);

 // Clear cached merged bean definitions since the post-processors might have
  // modified the original metadata, e.g. replacing placeholders in values...
  beanFactory.clearMetadataCache();	
}

分析:

该方法比较长,但是逻辑很清晰
三个集合保存找出来的bean信息,如下:

  1. registryPostProcessors:记录硬编码方式注册的BeanDefinitionRegistryPostProcessor。
  2. regularPostProcessors:记录硬编码注册的BeanFactoryPostProcessor。
  3. processedBeans:记录已经处理过的BeanDefinitionRegistryPostProcessor。

具体步骤,如下:

  1. 首先检查在AbstractApplicationContext类中属性beanFactoryPostProcessors是否含有数据,如果有进行处理。继承BeanDefinitionRegistryPostProcessor 放到registryPostProcessors集合中,其他放到regularPostProcessors集合中。
  2. 查找spring上下文中(beanFactory)是否含有BeanDefinitionRegistryPostProcessor的子类,找出继承PriorityOrdered的类,进行实例化(执行Spring生命周期)、排序、调用方法。
  3. 查找spring上下文中(beanFactory)是否含有BeanDefinitionRegistryPostProcessor的子类,找出继承Ordered的类,进行实例化(执行Spring生命周期)、排序、调用方法。
  4. 查找spring上下文中(beanFactory)是否含有BeanDefinitionRegistryPostProcessor的子类,找出步骤3步骤4没有执行的Bean,进行实例化(执行Spring生命周期)、排序、调用方法。
  5. 处理registryPostProcessors集合中,处理regularPostProcessors集合中。
  6. 处理beanFactoryPostProcessors子类。

注:关于步骤一属性beanFactoryPostProcessors,可以在项目启动时利用
((ConfigurableApplicationContext)applicationContext).addBeanFactoryPostProcessor();动态增加,如在Spring boot中,可以继承ApplicationContextInitializer来扩展

这里写图片描述
跟踪代码可知当执行到步骤2时,会找到ConfigurationClassPostProcessor 类放到registryPostProcessors集合中,接下来会执行ConfigurationClassPostProcessor 的postProcessBeanDefinitionRegistry方法。
ConfigurationClassPostProcessor 类代码:

public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPostProcessor,
	PriorityOrdered, ResourceLoaderAware, BeanClassLoaderAware, EnvironmentAware {
}

1.2 获取Spring上下文中含有@Configuration的类

类:ConfigurationClassPostProcessor
代码

public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {
	List<BeanDefinitionHolder> configCandidates = new ArrayList<BeanDefinitionHolder>();
	// ⑴ 获得所有的BeanDefintionName
	String[] candidateNames = registry.getBeanDefinitionNames();

	// 循环遍历BeanDefintionName
	for (String beanName : candidateNames) {
	BeanDefinition beanDef = registry.getBeanDefinition(beanName);
	// 是否处理过lite模式或full模式
	if (ConfigurationClassUtils.isFullConfigurationClass(beanDef) ||
			ConfigurationClassUtils.isLiteConfigurationClass(beanDef)) {
		if (logger.isDebugEnabled()) {
			logger.debug("Bean definition has already been processed as a configuration class: " + beanDef);
		}
	}
	// ⑵ 获取@Configuration和@Bean处理,设置标志位BeanFactory属性Attributes,并将该类加入configCandidates集合中
		else if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.metadataReaderFactory)) {
			configCandidates.add(new BeanDefinitionHolder(beanDef, beanName));
		}
	}

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

	// ⑶ 排序
	Collections.sort(configCandidates, new Comparator<BeanDefinitionHolder>() {
		@Override
		public int compare(BeanDefinitionHolder bd1, BeanDefinitionHolder bd2) {
			int i1 = ConfigurationClassUtils.getOrder(bd1.getBeanDefinition());
			int i2 = ConfigurationClassUtils.getOrder(bd2.getBeanDefinition());
			return (i1 < i2) ? -1 : (i1 > i2) ? 1 : 0;
		}
	});
	// Detect any custom bean name generation strategy supplied through the enclosing application context
	SingletonBeanRegistry singletonRegistry = null;
	if (registry instanceof SingletonBeanRegistry) {
		singletonRegistry = (SingletonBeanRegistry) registry;
		if (!this.localBeanNameGeneratorSet && singletonRegistry.containsSingleton(CONFIGURATION_BEAN_NAME_GENERATOR)) {
			BeanNameGenerator generator = (BeanNameGenerator)    		singletonRegistry.getSingleton(CONFIGURATION_BEAN_NAME_GENERATOR);
			this.componentScanBeanNameGenerator = generator;
			this.importBeanNameGenerator = generator;
		}
	}

	// ⑷ ★处理每个 @Configuration 类★
	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 {
	   // ★解析,只是单纯的解析@Configuration,具体将Bean载入到BeanFactory中在下边★
		parser.parse(candidates);
		parser.validate();
	
		Set<ConfigurationClass> configClasses = new LinkedHashSet<ConfigurationClass>(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());
		}
		// ★将Bean注册到BeanFactory★
		this.reader.loadBeanDefinitions(configClasses);
		alreadyParsed.addAll(configClasses);
		candidates.clear();
		if (registry.getBeanDefinitionCount() > candidateNames.length) {
			String[] newCandidateNames = registry.getBeanDefinitionNames();
			Set<String> oldCandidateNames = new HashSet<String>(Arrays.asList(candidateNames));
			Set<String> alreadyParsedClasses = new HashSet<String>();
			for (ConfigurationClass configurationClass : alreadyParsed) {
				alreadyParsedClasses.add(configurationClass.getMetadata().getClassName());
			}
			for (String candidateName : newCandidateNames) {
				if (!oldCandidateNames.contains(candidateName)) {
					BeanDefinition beanDef = registry.getBeanDefinition(candidateName);
					if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.metadataReaderFactory) &&
								!alreadyParsedClasses.contains(beanDef.getBeanClassName())) {
						candidates.add(new BeanDefinitionHolder(beanDef, candidateName));
					}
				}
			}
			candidateNames = newCandidateNames;
		}
	}
	while (!candidates.isEmpty());
	
	// Register the ImportRegistry as a bean in order to support ImportAware @Configuration classes
	if (singletonRegistry != null) {
		if (!singletonRegistry.containsSingleton(IMPORT_REGISTRY_BEAN_NAME)) {
			singletonRegistry.registerSingleton(IMPORT_REGISTRY_BEAN_NAME, parser.getImportRegistry());
		}
	}
	
	if (this.metadataReaderFactory instanceof CachingMetadataReaderFactory) {
		((CachingMetadataReaderFactory) this.metadataReaderFactory).clearCache();
	}
}

分析

这里写图片描述
这里写图片描述
通过代码跟踪可知,主要做了以工作:

  1. 获得所有注册过的BeanDefinition信息;
  2. 获取@Configuration和@Bean处理,设置标志位BeanFactory属性Attributes,并将该类加入configCandidates集合中;
  3. 进行排序
  4. 处理每个 @Configuration 类
    4.1 解析,只是单纯的解析@Configuration,具体将Bean载入到BeanFactory中在下边
    4.2 将Bean注册到BeanFactory

注:当@Bean方法在没有使用@Configuration注释的类中声明时,它们被称为在’lite’模式下处理;在常见情况下,@Bean方法将在@Configuration类中声明,确保始终使用’full’模式。

1.3 处理含有注解@Configuration的类

类:ConfigurationClassParser
代码

protected void processConfigurationClass(ConfigurationClass configClass) throws IOException {
  if (this.conditionEvaluator.shouldSkip(configClass.getMetadata(), ConfigurationPhase.PARSE_CONFIGURATION)) {
	return;
  }

  ConfigurationClass existingClass = this.configurationClasses.get(configClass);
  if (existingClass != null) {
	if (configClass.isImported()) {
		if (existingClass.isImported()) {
			existingClass.mergeImportedBy(configClass);
		}
		// Otherwise ignore new imported config class; existing non-imported class overrides it.
		return;
	}
	else {
		// Explicit bean definition found, probably replacing an import.
		// Let's remove the old one and go with the new one.
		this.configurationClasses.remove(configClass);
		for (Iterator<ConfigurationClass> it = this.knownSuperclasses.values().iterator(); it.hasNext(); ) {
			if (configClass.equals(it.next())) {
				it.remove();
			}
		}
	}
}
// 递归处理	
 SourceClass sourceClass = asSourceClass(configClass);
 do {
	sourceClass = doProcessConfigurationClass(configClass, sourceClass);	
 }
 while (sourceClass != null);
	this.configurationClasses.put(configClass, configClass);
 }
	

// 关键方法
protected final SourceClass doProcessConfigurationClass(ConfigurationClass configClass, SourceClass sourceClass) throws IOException {
  // Recursively process any member (nested) classes first
  processMemberClasses(configClass, sourceClass);

  // 处理 @PropertySource注解
  for (AnnotationAttributes propertySource : AnnotationConfigUtils.attributesForRepeatable(
			sourceClass.getMetadata(), PropertySources.class, org.springframework.context.annotation.PropertySource.class)) {
	if (this.environment instanceof ConfigurableEnvironment) {
		processPropertySource(propertySource);
	}
	else {
		logger.warn("Ignoring @PropertySource annotation on [" + sourceClass.getMetadata().getClassName() +
			"]. Reason: Environment must implement ConfigurableEnvironment");
	}
}

 // 处理 @ComponentScan注解
 Set<AnnotationAttributes> componentScans = AnnotationConfigUtils.attributesForRepeatable(
		sourceClass.getMetadata(), ComponentScans.class, ComponentScan.class);
	if (!componentScans.isEmpty() && !this.conditionEvaluator.shouldSkip(sourceClass.getMetadata(), ConfigurationPhase.REGISTER_BEAN)) {
	for (AnnotationAttributes componentScan : componentScans) {
		// 对@ComponentScan进行解析
		Set<BeanDefinitionHolder> scannedBeanDefinitions =
			this.componentScanParser.parse(componentScan, sourceClass.getMetadata().getClassName());
		// 处理扫描出来的Bean信息,递归的处理
		for (BeanDefinitionHolder holder : scannedBeanDefinitions) {
		// 如果有@Configuration或@Bean定义则递归进行
		if (ConfigurationClassUtils.checkConfigurationClassCandidate(holder.getBeanDefinition(), this.metadataReaderFactory)) {
			parse(holder.getBeanDefinition().getBeanClassName(), holder.getBeanName());
		}
	}
 }
}

  // 处理 @Import注解
    processImports(configClass, sourceClass, getImports(sourceClass), true);

  // 处理 @ImportResource注解
  if (sourceClass.getMetadata().isAnnotated(ImportResource.class.getName())) {
	AnnotationAttributes importResource =
		AnnotationConfigUtils.attributesFor(sourceClass.getMetadata(), ImportResource.class);
	String[] resources = importResource.getStringArray("locations");
	Class<? extends BeanDefinitionReader> readerClass = importResource.getClass("reader");
	for (String resource : resources) {
		String resolvedResource = this.environment.resolveRequiredPlaceholders(resource);
		configClass.addImportedResource(resolvedResource, readerClass);
	}
  }

   // 处理 @Bean注解
   Set<MethodMetadata> beanMethods = retrieveBeanMethodMetadata(sourceClass);
   for (MethodMetadata methodMetadata : beanMethods) {
	configClass.addBeanMethod(new BeanMethod(methodMetadata, configClass));
  }
  // Process default methods on interfaces
  processInterfaces(configClass, sourceClass);

  // Process superclass, if any
  if (sourceClass.getMetadata().hasSuperClass()) {
	String superclass = sourceClass.getMetadata().getSuperClassName();
	if (!superclass.startsWith("java") && !this.knownSuperclasses.containsKey(superclass)) {
		this.knownSuperclasses.put(superclass, configClass);
		// Superclass found, return its annotation metadata and recurse
		return sourceClass.getSuperClass();
	}
 }
 // No superclass -> processing is complete
 return null;
}
	

分析:

处理含有注解@Configuration的类,如果该类上有注解@ComponentScan则进行【1.4 处理 @ComponentScan注解】。
处理流程如下:
- 处理 @PropertySource注解。
- 处理 @ComponentScan注解。
- 处理 @Import注解。
- 处理 @ImportResource注解。
- 处理 @Bean注解。

流程图:
这里写图片描述

1.3.1 处理 @ComponentScan注解

类:ComponentScanAnnotationParser,ClassPathBeanDefinitionScanner
代码

public Set<BeanDefinitionHolder> parse(AnnotationAttributes componentScan, final String declaringClass) {
		Assert.state(this.environment != null, "Environment must not be null");
		Assert.state(this.resourceLoader != null, "ResourceLoader must not be null");

		ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(this.registry,
				componentScan.getBoolean("useDefaultFilters"), this.environment, this.resourceLoader);

		Class<? extends BeanNameGenerator> generatorClass = componentScan.getClass("nameGenerator");
		boolean useInheritedGenerator = (BeanNameGenerator.class == generatorClass);
		scanner.setBeanNameGenerator(useInheritedGenerator ? this.beanNameGenerator :
				BeanUtils.instantiateClass(generatorClass));

		ScopedProxyMode scopedProxyMode = componentScan.getEnum("scopedProxy");
		if (scopedProxyMode != ScopedProxyMode.DEFAULT) {
			scanner.setScopedProxyMode(scopedProxyMode);
		}
		else {
			Class<? extends ScopeMetadataResolver> resolverClass = componentScan.getClass("scopeResolver");
			scanner.setScopeMetadataResolver(BeanUtils.instantiateClass(resolverClass));
		}

		scanner.setResourcePattern(componentScan.getString("resourcePattern"));

		for (AnnotationAttributes filter : componentScan.getAnnotationArray("includeFilters")) {
			for (TypeFilter typeFilter : typeFiltersFor(filter)) {
				scanner.addIncludeFilter(typeFilter);
			}
		}
		for (AnnotationAttributes filter : componentScan.getAnnotationArray("excludeFilters")) {
			for (TypeFilter typeFilter : typeFiltersFor(filter)) {
				scanner.addExcludeFilter(typeFilter);
			}
		}

		boolean lazyInit = componentScan.getBoolean("lazyInit");
		if (lazyInit) {
			scanner.getBeanDefinitionDefaults().setLazyInit(true);
		}

		Set<String> basePackages = new LinkedHashSet<String>();
		String[] basePackagesArray = componentScan.getStringArray("basePackages");
		for (String pkg : basePackagesArray) {
			String[] tokenized = StringUtils.tokenizeToStringArray(this.environment.resolvePlaceholders(pkg),
					ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS);
			basePackages.addAll(Arrays.asList(tokenized));
		}
		for (Class<?> clazz : componentScan.getClassArray("basePackageClasses")) {
			basePackages.add(ClassUtils.getPackageName(clazz));
		}
		if (basePackages.isEmpty()) {
			basePackages.add(ClassUtils.getPackageName(declaringClass));
		}

		scanner.addExcludeFilter(new AbstractTypeHierarchyTraversingFilter(false, false) {
			@Override
			protected boolean matchClassName(String className) {
				return declaringClass.equals(className);
			}
		});
		// 扫描@Compansan注解里的包,加载bean,并注入到spring上下中
		return scanner.doScan(StringUtils.toStringArray(basePackages));
	}

分析
在获取 @ComponentScan注解的值,通过ClassPathBeanDefinitionScanner扫描所有该包下的类信息,并注册到Spring上下文中。

1.3.2 处理 @Import注解

private void processImports(ConfigurationClass configClass, SourceClass currentSourceClass,
	Collection<SourceClass> importCandidates, boolean checkForCircularImports) throws IOException {

  if (importCandidates.isEmpty()) {
	return;
  }
  if (checkForCircularImports && isChainedImportOnStack(configClass)) {
		this.problemReporter.error(new CircularImportProblem(configClass, this.importStack));
		}
		else {
			this.importStack.push(configClass);
			try {
				for (SourceClass candidate : importCandidates) {
				    // ⑴ 继承ImportSelector接口的类,会先进行实例化(没有走spring的生命周期)、设置Aware类调用、调用selectImports方法获得参数、递归调用该方法。
					if (candidate.isAssignable(ImportSelector.class)) {
						// Candidate class is an ImportSelector -> delegate to it to determine imports
						Class<?> candidateClass = candidate.loadClass();
						// 实例化(没有走spring的生命周期)
						ImportSelector selector = BeanUtils.instantiateClass(candidateClass, ImportSelector.class);
				    // 设置Aware类
						ParserStrategyUtils.invokeAwareMethods(
								selector, this.environment, this.resourceLoader, this.registry);
					if (this.deferredImportSelectors != null && selector instanceof DeferredImportSelector) {
							this.deferredImportSelectors.add(
								new DeferredImportSelectorHolder(configClass, (DeferredImportSelector) selector));
						}
						else {
						// 调用selectImports方法获得参数
							String[] importClassNames = selector.selectImports(currentSourceClass.getMetadata());
							Collection<SourceClass> importSourceClasses = asSourceClasses(importClassNames);
							// 递归
							processImports(configClass, currentSourceClass, importSourceClasses, false);
						}
					}
					  // ⑵ 继承ImportBeanDefinitionRegistrar,会先进行实例化(没有走spring的生命周期)、设置Aware类调用、将放到ConfigurationClass类importBeanDefinitionRegistrars属性中。
					else if (candidate.isAssignable(ImportBeanDefinitionRegistrar.class)) {
						// Candidate class is an ImportBeanDefinitionRegistrar ->
						// delegate to it to register additional bean definitions
						Class<?> candidateClass = candidate.loadClass();
				ImportBeanDefinitionRegistrar registrar =
						BeanUtils.instantiateClass(candidateClass, ImportBeanDefinitionRegistrar.class);
				ParserStrategyUtils.invokeAwareMethods(
						registrar, this.environment, this.resourceLoader, this.registry);
			configClass.addImportBeanDefinitionRegistrar(registrar, currentSourceClass.getMetadata());
			}
			 // 处理其他的类
			else {
				// Candidate class not an ImportSelector or ImportBeanDefinitionRegistrar ->
				// process it as an @Configuration class
				this.importStack.registerImport(
						currentSourceClass.getMetadata(), candidate.getMetadata().getClassName());
				processConfigurationClass(candidate.asConfigClass(configClass));
				}
			}
		}
		catch (BeanDefinitionStoreException ex) {
			throw ex;
		}
		catch (Throwable ex) {
			throw new BeanDefinitionStoreException("Failed to process import candidates for configuration class [" +
					configClass.getMetadata().getClassName() + "]", ex);
		}
		finally {
			this.importStack.pop();
		}
	}
}

跟踪代码
这里写图片描述
这里写图片描述
会扫描该类中的@Import注解,并获得该类中含有@Import的注解信息。

  1. 继承ImportSelector接口的类,会先进行实例化(没有走spring的生命周期)、设置Aware类调用、调用selectImports方法获得参数、递归调用该方法。
  2. 继承ImportBeanDefinitionRegistrar,会先进行实例化(没有走spring的生命周期)、设置Aware类调用、将放到ConfigurationClass类importBeanDefinitionRegistrars属性中。
  3. 当成Configuration递归调用processConfigurationClass方法。

注:步骤二:将实例化的ImportBeanDefinitionRegistrar子类放到ConfigurationClass类importBeanDefinitionRegistrars属性中作用是什么,我们先看ImportBeanDefinitionRegistrar 代码:

public interface ImportBeanDefinitionRegistrar {
	public void registerBeanDefinitions(
			AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);

}

在回顾一下1.2 节中处理每个 @Configuration 类中将Bean注册到BeanFactory,看代码:
// ⑷ ★处理每个 @Configuration 类★
		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 {
		   // ★解析,只是单纯的解析@Configuration,具体将Bean载入到BeanFactory中在下边★
			parser.parse(candidates);
			parser.validate();

			Set<ConfigurationClass> configClasses = new LinkedHashSet<ConfigurationClass>(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());
			}
			// ★将Bean注册到BeanFactory★
			this.reader.loadBeanDefinitions(configClasses);
			alreadyParsed.addAll(configClasses);

			candidates.clear();
			if (registry.getBeanDefinitionCount() > candidateNames.length) {
				String[] newCandidateNames = registry.getBeanDefinitionNames();
				Set<String> oldCandidateNames = new HashSet<String>(Arrays.asList(candidateNames));
				Set<String> alreadyParsedClasses = new HashSet<String>();
				for (ConfigurationClass configurationClass : alreadyParsed) {
					alreadyParsedClasses.add(configurationClass.getMetadata().getClassName());
				}
				for (String candidateName : newCandidateNames) {
					if (!oldCandidateNames.contains(candidateName)) {
						BeanDefinition beanDef = registry.getBeanDefinition(candidateName);
						if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.metadataReaderFactory) &&
								!alreadyParsedClasses.contains(beanDef.getBeanClassName())) {
							candidates.add(new BeanDefinitionHolder(beanDef, candidateName));
						}
					}
				}
				candidateNames = newCandidateNames;
			}
		}
		while (!candidates.isEmpty());
有一个this.reader.loadBeanDefinitions(configClasses);处理,跟踪一下,代码:
private void loadBeanDefinitionsForConfigurationClass(ConfigurationClass configClass,
			TrackedConditionEvaluator trackedConditionEvaluator) {

		if (trackedConditionEvaluator.shouldSkip(configClass)) {
			String beanName = configClass.getBeanName();
			if (StringUtils.hasLength(beanName) && this.registry.containsBeanDefinition(beanName)) {
				this.registry.removeBeanDefinition(beanName);
			}
			this.importRegistry.removeImportingClass(configClass.getMetadata().getClassName());
			return;
		}

		if (configClass.isImported()) {
			registerBeanDefinitionForImportedConfigurationClass(configClass);
		}
		for (BeanMethod beanMethod : configClass.getBeanMethods()) {
			loadBeanDefinitionsForBeanMethod(beanMethod);
		}
		loadBeanDefinitionsFromImportedResources(configClass.getImportedResources());
		loadBeanDefinitionsFromRegistrars(configClass.getImportBeanDefinitionRegistrars());
	}

private void loadBeanDefinitionsFromRegistrars(Map<ImportBeanDefinitionRegistrar, AnnotationMetadata> registrars) {
		for (Map.Entry<ImportBeanDefinitionRegistrar, AnnotationMetadata> entry : registrars.entrySet()) {
			entry.getKey().registerBeanDefinitions(entry.getValue(), this.registry);
		}
	}
我们通过代码发现在代码最后一行,通过configClass去拿了ConfigurationClass类importBeanDefinitionRegistrars属性数据调用registerBeanDefinitions方法。 ## 3 注册拦截Bean创建的Bean处理

4 初始化剩下的单实例(非惰性)

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值