spring Conditional是怎么生效的

平时看spring源码中经常用到Conditional这个注解,今天来看一下他是怎么生效的

  1. 其实我是发现Conditional注解是在ConditionEvaluator类的shouldSkip方法中调用了org.springframework.context.annotation.ConditionEvaluator#shouldSkip
    shouldSkip方法有个枚举类型的参数ConfigurationPhase, PARSE_CONFIGURATION 是标示配置解析阶段;REGISTER_BEAN标示配置注册阶段
/**
	 * The various configuration phases where the condition could be evaluated.
	 */
	enum ConfigurationPhase {

		/**
		 * The {@link Condition} should be evaluated as a {@code @Configuration}
		 * class is being parsed.
		 * 

If the condition does not match at this point, the {@code @Configuration} * class will not be added. */ PARSE_CONFIGURATION, /** * The {@link Condition} should be evaluated when adding a regular * (non {@code @Configuration}) bean. The condition will not prevent * {@code @Configuration} classes from being added. *

At the time that the condition is evaluated, all {@code @Configuration}s * will have been parsed. */ REGISTER_BEAN }

  1. 接着发现shouldSkip方法是在ConfigurationClassParser类的processConfigurationClass方法中进行了调用org.springframework.context.annotation.ConfigurationClassParser#processConfigurationClass

回到ConfigurationClassParser这个类就比较好理解,说明还是在解析配置阶段根据Conditional注解进行处理的
ConfigurationClassParser 解析配置流程,点击查看

参考文档中对Conditional注解有更详细的讲解

你可能感兴趣的:(spring)