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的条件注解源码解析

@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的条件注解源码解析的更多相关文章

  1. Spring Boot @Enable*注解源码解析及自定义@Enable*

      Spring Boot 一个重要的特点就是自动配置,约定大于配置,几乎所有组件使用其本身约定好的默认配置就可以使用,大大减轻配置的麻烦.其实现自动配置一个方式就是使用@Enable*注解,见其名知 ...

  2. 异步任务spring @Async注解源码解析

    1.引子 开启异步任务使用方法: 1).方法上加@Async注解 2).启动类或者配置类上@EnableAsync 2.源码解析 虽然spring5已经出来了,但是我们还是使用的spring4,本文就 ...

  3. SpringBoot 2.0.3 源码解析

    前言 用SpringBoot也有很长一段时间了,一直是底层使用者,没有研究过其到底是怎么运行的,借此机会今天试着将源码读一下,在此记录...我这里使用的SpringBoot 版本是  2.0.3.RE ...

  4. Spring @Import注解源码解析

    简介 Spring 3.0之前,创建Bean可以通过xml配置文件与扫描特定包下面的类来将类注入到Spring IOC容器内.而在Spring 3.0之后提供了JavaConfig的方式,也就是将IO ...

  5. SpringBoot自动配置的源码解析

    首先,写源码分析真的很花时间,所以希望大家转的时候也请注明一下,Thanks♪(・ω・)ノ SpringBoot最大的好处就是对于很多框架都默认的配置,让我们开发的时候不必为了大一堆的配置文件头疼,关 ...

  6. SpringBoot exception异常处理机制源码解析

    一.Spring Boot默认的异常处理机制 1:浏览器默认返回效果 2:原理解析 为了便于源码跟踪解析,在·Controller中手动设置异常. @RequestMapping(value=&quo ...

  7. @RequesParam注解源码解析

  8. Spring源码解析系列汇总

    相信我,你会收藏这篇文章的 本篇文章是这段时间撸出来的Spring源码解析系列文章的汇总,总共包含以下专题.喜欢的同学可以收藏起来以备不时之需 SpringIOC源码解析(上) 本篇文章搭建了IOC源 ...

  9. SpringBoot之DispatcherServlet详解及源码解析

    在使用SpringBoot之后,我们表面上已经无法直接看到DispatcherServlet的使用了.本篇文章,带大家从最初DispatcherServlet的使用开始到SpringBoot源码中Di ...

随机推荐

  1. 利用ADB命令强制卸载oppo自带浏览器

    前言 oppo手机是自带oppo浏览器的,这个自带的浏览器带有oppo推荐的负面新闻很多,而且有时也自动推送一些消息给用户,页面不够简洁,打开浏览器负面内容比较多,所以想要强制卸载oppo浏览器,然后 ...

  2. buuctf-pwn:jarvisoj_level6_x64

    jarvisoj_level6_x64 只能申请unsorted bin大小下的unlink IDA看一下,可以发现edit里面有任意堆溢出的情况(realloc造成堆溢出) 然后free里面有UAF ...

  3. vue生命钩子函数

    vue的生命钩子函数在使用Vue开发中是非常重要的一环,可以说,生命钩子函数使开发变得更加便捷. 下图是Vue的生命周期图: 具体钩子如下: beforeCreate created beforeMo ...

  4. POJ2432 Around the world

    题意描述 Around the world 在一个圆上有 \(n\) 点,其中有 \(m\) 条双向边连接它们,每条双向边连接两点总是沿着圆的最小弧连接. 求从 \(1\) 号点出发并回到 \(1\) ...

  5. SpringBoot中的classpath

    一句话总结:classpath 等价于 main/java + main/resources + 第三方jar包的根目录.下面详细解释. 首先,classpath顾名思义,是编译之后项目的路径,而不是 ...

  6. yaf拓展安装步骤

    1.wget http://pecl.php.net/get/yaf-3.0.7.tgz //下载yaf.tar 2.tar zxvf yaf-3.0.7.tgz //解压 3.cd yaf-3.0. ...

  7. leetcode56:restore-ip-addresses

    题目描述 现在有一个只包含数字的字符串,将该字符串重新存储成IP地址的形式,返回所有可能的情况. 例如: 给出的字符串为"25525511135", 返回["255.25 ...

  8. ERP的主数据的操作与设计--开源软件诞生25

    赤龙ERP主数据管理讲解--第25篇 用日志记录"开源软件"的诞生 [进入地址 点亮星星]----祈盼着一个鼓励 博主开源地址: 码云:https://gitee.com/redr ...

  9. Flink SQL Client初探

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  10. Docker学习笔记:Alpine镜像+Python3安装+http服务器

    编写Dockerfile文件使用最新的Alpine镜像并安装Python3环境,如下: 因为python高于3.4则不会默认安装pip,需要手动安装. 试了很多其他办法都没安装上,唯有下载get-pi ...