首页 > 编程语言 > 详细

SpringBoot的条件注解源码解析

时间:2020-11-26 18:24:18      阅读:27      评论:0      收藏:0      [点我收藏+]

SpringBoot的条件注解源码解析

@ConditionalOnBean、@ConditionalOnMissingBean

技术分享图片

技术分享图片
技术分享图片

启动项目
会在ConfigurationClassBeanDefinitionReader#loadBeanDefinitions_(Set<ConfigurationClass> configurationModel)方法中解析我们 的配置类_ConditionConfig
技术分享图片
技术分享图片

在上图中的conditionEvaluator.shouldSkiP就会调用SpringBootCondition类中的matches方法进行匹配 该方法返回boolean类型

matches方法调用getMatchOutcome方法获取匹配结果
真正的匹配是在OnBeanCondition#getMatchOutcome

@ConditionalOnBean、@ConditionalOnMissingBean和@ConditionalOnSingleCandidate都是使用这个OnBeanCondition条件类
进行匹配的

OnBeanCondition#getMatchOutcome

下面我们看一下具体的匹配逻辑
技术分享图片

技术分享图片
技术分享图片

调用 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

SpringBoot的条件注解源码解析

原文:https://www.cnblogs.com/greatanan/p/14043053.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!