栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

SpringBoot源码系列(3)--springboot自动装配

Java 更新时间:发布时间: 百科书网 趣学号

接上文,这里从refreshContext(context)开始读

1、refreshContext(context)
	protected void refresh(ApplicationContext applicationContext) {
		Assert.isInstanceOf(AbstractApplicationContext.class, applicationContext);
		((AbstractApplicationContext) applicationContext).refresh();
	}
2、AbstractApplicationContext.refresh()
invokeBeanFactoryPostProcessors(beanFactory);
3、invokeBeanFactoryPostProcessors(beanFactory)
	protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
		PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());

		// Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
		// (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
		if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
			beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
			beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
		}
	}
 4、PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
	private static void invokeBeanDefinitionRegistryPostProcessors(
			Collection postProcessors, BeanDefinitionRegistry registry) {

		for (BeanDefinitionRegistryPostProcessor postProcessor : postProcessors) {
			postProcessor.postProcessBeanDefinitionRegistry(registry);
		}
	}

 5、ConfigurationClassPostProccessor.postProcessBeanDefinitionRegistry

	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);
	}

6、 ConfigurationClassPostProccessor.processConfigBeanDefinitions

       bd instanceof AnnotatedBeanDefinition 

parser.parse(candidates);
	public void parse(Set configCandidates) {
		for (BeanDefinitionHolder holder : configCandidates) {
			BeanDefinition bd = holder.getBeanDefinition();
			try {
				if (bd instanceof AnnotatedBeanDefinition) {
					parse(((AnnotatedBeanDefinition) bd).getmetadata(), holder.getBeanName());
				}
				else if (bd instanceof AbstractBeanDefinition && ((AbstractBeanDefinition) bd).hasBeanClass()) {
					parse(((AbstractBeanDefinition) bd).getBeanClass(), holder.getBeanName());
				}
				else {
					parse(bd.getBeanClassName(), holder.getBeanName());
				}
			}
			catch (BeanDefinitionStoreException ex) {
				throw ex;
			}
			catch (Throwable ex) {
				throw new BeanDefinitionStoreException(
						"Failed to parse configuration class [" + bd.getBeanClassName() + "]", ex);
			}
		}

		this.deferredimportSelectorHandler.process();
	}

7、 ConfigurationClassParser.parse()

	protected final void parse(Annotationmetadata metadata, String beanName) throws IOException {
		processConfigurationClass(new ConfigurationClass(metadata, beanName));
	}

 8、ConfigurationClassParser.processConfigurationClass(configClass)

		do {
			sourceClass = doProcessConfigurationClass(configClass, sourceClass);
		}
		while (sourceClass != null);

9、ConfigurationClassParser.doProcessConfigurationClass(configClass, sourceClass)

		// Process any @import annotations
		processimports(configClass, sourceClass, getimports(sourceClass), true);
getimports(sourceClass)
	
	private Set getimports(SourceClass sourceClass) throws IOException {
		Set imports = new linkedHashSet<>();
		Set visited = new linkedHashSet<>();
		collectimports(sourceClass, imports, visited);
		return imports;
	}
	
	private void collectimports(SourceClass sourceClass, Set imports, Set visited)
			throws IOException {

		if (visited.add(sourceClass)) {
			for (SourceClass annotation : sourceClass.getAnnotations()) {
				String annName = annotation.getmetadata().getClassName();
				if (!annName.equals(import.class.getName())) {
					collectimports(annotation, imports, visited);
				}
			}
			imports.addAll(sourceClass.getAnnotationAttributes(import.class.getName(), "value"));
		}
	}

 这里就扫描到了全部带有@import注解的类,再回到ConfigurationClassParser.parse(configCandidates),最后一行this.deferredimportSelectorHandler.process();

	public void parse(Set configCandidates) {
		for (BeanDefinitionHolder holder : configCandidates) {
			BeanDefinition bd = holder.getBeanDefinition();
			try {
				if (bd instanceof AnnotatedBeanDefinition) {
					parse(((AnnotatedBeanDefinition) bd).getmetadata(), holder.getBeanName());
				}
				else if (bd instanceof AbstractBeanDefinition && ((AbstractBeanDefinition) bd).hasBeanClass()) {
					parse(((AbstractBeanDefinition) bd).getBeanClass(), holder.getBeanName());
				}
				else {
					parse(bd.getBeanClassName(), holder.getBeanName());
				}
			}
			catch (BeanDefinitionStoreException ex) {
				throw ex;
			}
			catch (Throwable ex) {
				throw new BeanDefinitionStoreException(
						"Failed to parse configuration class [" + bd.getBeanClassName() + "]", ex);
			}
		}

		this.deferredimportSelectorHandler.process();
	}

10、ConfigurationClassParser.process()进入方法handler.processGroupimports()

		public void process() {
			List deferredimports = this.deferredimportSelectors;
			this.deferredimportSelectors = null;
			try {
				if (deferredimports != null) {
					DeferredimportSelectorGroupingHandler handler = new DeferredimportSelectorGroupingHandler();
					deferredimports.sort(DEFERRED_import_COMPARATOR);
					deferredimports.forEach(handler::register);
					handler.processGroupimports();
				}
			}
			finally {
				this.deferredimportSelectors = new ArrayList<>();
			}
		}

11、ConfigurationClassParser.processGroupimports(),然后进入grouping.getimports()

		public void processGroupimports() {
			for (DeferredimportSelectorGrouping grouping : this.groupings.values()) {
				grouping.getimports().forEach(entry -> {
					ConfigurationClass configurationClass = this.configurationClasses.get(
							entry.getmetadata());
					try {
						processimports(configurationClass, asSourceClass(configurationClass),
								asSourceClasses(entry.getimportClassName()), false);
					}
					catch (BeanDefinitionStoreException ex) {
						throw ex;
					}
					catch (Throwable ex) {
						throw new BeanDefinitionStoreException(
								"Failed to process import candidates for configuration class [" +
										configurationClass.getmetadata().getClassName() + "]", ex);
					}
				});
			}
		}

12、ConfigurationClassParser.getimports() 然后进入this.group.process(deferredimport.getConfigurationClass().getmetadata(), deferredimport.getimportSelector());

		public Iterable getimports() {
			for (DeferredimportSelectorHolder deferredimport : this.deferredimports) {
				this.group.process(deferredimport.getConfigurationClass().getmetadata(),
						deferredimport.getimportSelector());
			}
			return this.group.selectimports();
		}

 13、AutoConfigurationimportSelector.process(Annotationmetadata annotationmetadata, DeferredimportSelector deferredimportSelector),然后进入AutoConfigurationimportSelector.getAutoConfigurationEntry(getAutoConfigurationmetadata(), annotationmetadata);

		@Override
		public void process(Annotationmetadata annotationmetadata, DeferredimportSelector deferredimportSelector) {
			Assert.state(deferredimportSelector instanceof AutoConfigurationimportSelector,
					() -> String.format("only %s implementations are supported, got %s",
							AutoConfigurationimportSelector.class.getSimpleName(),
							deferredimportSelector.getClass().getName()));
			AutoConfigurationEntry autoConfigurationEntry = ((AutoConfigurationimportSelector) deferredimportSelector)
					.getAutoConfigurationEntry(getAutoConfigurationmetadata(), annotationmetadata);
			this.autoConfigurationEntries.add(autoConfigurationEntry);
			for (String importClassName : autoConfigurationEntry.getConfigurations()) {
				this.entries.putIfAbsent(importClassName, annotationmetadata);
			}
		}

14、AutoConfigurationimportSelector.getAutoConfigurationEntry(AutoConfigurationmetadata autoConfigurationmetadata, Annotationmetadata annotationmetadata),然后进入方法getCandidateConfigurations(annotationmetadata, attributes)

	protected AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationmetadata autoConfigurationmetadata,
			Annotationmetadata annotationmetadata) {
		if (!isEnabled(annotationmetadata)) {
			return EMPTY_ENTRY;
		}
		AnnotationAttributes attributes = getAttributes(annotationmetadata);
		List configurations = getCandidateConfigurations(annotationmetadata, attributes);
		configurations = removeDuplicates(configurations);
		Set exclusions = getExclusions(annotationmetadata, attributes);
		checkExcludedClasses(configurations, exclusions);
		configurations.removeAll(exclusions);
		configurations = filter(configurations, autoConfigurationmetadata);
		fireAutoConfigurationimportEvents(configurations, exclusions);
		return new AutoConfigurationEntry(configurations, exclusions);
	}

15、在AutoConfigurationimportSelector.getCandidateConfigurations方法中会从spring.factories文件中加载key值为EnableAutoConfiguration 的配置类

	protected List getCandidateConfigurations(Annotationmetadata metadata, AnnotationAttributes attributes) {
		List configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
				getBeanClassLoader());
		Assert.notEmpty(configurations, "No auto configuration classes found in meta-INF/spring.factories. If you "
				+ "are using a custom packaging, make sure that file is correct.");
		return configurations;
	}

到这里springBoot自动装配的代码就跟完了

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/295467.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号