启动项目
会在ConfigurationClassBeanDefinitionReader#loadBeanDefinitions_(Set<ConfigurationClass> configurationModel)方法中解析我们 的配置类_ConditionConfig
在上图中的conditionEvaluator.shouldSkiP就会调用SpringBootCondition类中的matches方法进行匹配 该方法返回boolean类型
matches方法调用getMatchOutcome方法获取匹配结果
真正的匹配是在OnBeanCondition#getMatchOutcome
@ConditionalOnBean、@ConditionalOnMissingBean和@ConditionalOnSingleCandidate都是使用这个OnBeanCondition条件类
进行匹配的
下面我们看一下具体的匹配逻辑
调用 BeanTypeRegistry# getNamesForType_(Class<?> type)_
BeanTypeRegistry类是位于包org.springframework.boot.autoconfigure.condition下的
可以知道它的作用就是便于spring boot条件注解的条件类_OnBeanCondition_的bean快速找到bean类型使用的bean类型注册表
上面流程走完也就能得到匹配结果了
这样在ConfigurationClassBeanDefinitionReader#loadBeanDefinitionsForBeanMethod_(BeanMethod beanMethod)方法中_
_判断是否需要跳过_this.conditionEvaluator.shouldSkip这个方法就会得到true或者false
conditionEvaluator.shouldSkip为true表示应该跳过
为false表示不跳过 然后执行后面的流程 把我们的@Bean方法对应的bean就注册进bd map中了
@ConditionalOnBean、@ConditionalOnMissingBean和@ConditionalOnSingleCandidate
这三个注解主要是借助 spring boot的条件类OnBeanCondition实现的
这个条件类的作用时机是在注册bd之前进行了 符合添加就注册为bd不符合就不注册bd
原文:https://www.cnblogs.com/greatanan/p/14043053.html