zl程序教程

您现在的位置是:首页 >  后端

当前栏目

SpringBoot中@Conditional注解

SpringBoot 注解 Conditional
2023-09-27 14:27:14 时间

放个图先
在这里插入图片描述

这个@Conditional之类的注解在ClassParserConfiguration类的parse方法得到处理。

class ClassParserConfiguration{
	...
	public void parse(Set<BeanDefinitionHolder> 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);
			}
		}
		// 这里面处理的
		// @EnableAutoConfiguration的@Import(AutoConfigurationImportSelector.class)的AutoConfigurationImportSelector就是一个DeferredImportSelector接口实现类
		this.deferredImportSelectorHandler.process();
	}
	...
}

然后进到上面代码块的最后一行后,最终到达AutoConfigurationImportSelector.class的代码:

class AutoConfigurationImportSelector{
		protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
		if (!isEnabled(annotationMetadata)) {
			return EMPTY_ENTRY;
		}
		AnnotationAttributes attributes = getAttributes(annotationMetadata);
		List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
		configurations = removeDuplicates(configurations);
		Set<String> exclusions = getExclusions(annotationMetadata, attributes);
		checkExcludedClasses(configurations, exclusions);
		configurations.removeAll(exclusions);
		// 这里进行对@Conditional的注解类进行filter
		configurations = getConfigurationClassFilter().filter(configurations);
		fireAutoConfigurationImportEvents(configurations, exclusions);
		return new AutoConfigurationEntry(configurations, exclusions);
	}


}