SpringBoot的条件注解源码解析
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的条件注解源码解析的更多相关文章
- Spring Boot @Enable*注解源码解析及自定义@Enable*
Spring Boot 一个重要的特点就是自动配置,约定大于配置,几乎所有组件使用其本身约定好的默认配置就可以使用,大大减轻配置的麻烦.其实现自动配置一个方式就是使用@Enable*注解,见其名知 ...
- 异步任务spring @Async注解源码解析
1.引子 开启异步任务使用方法: 1).方法上加@Async注解 2).启动类或者配置类上@EnableAsync 2.源码解析 虽然spring5已经出来了,但是我们还是使用的spring4,本文就 ...
- SpringBoot 2.0.3 源码解析
前言 用SpringBoot也有很长一段时间了,一直是底层使用者,没有研究过其到底是怎么运行的,借此机会今天试着将源码读一下,在此记录...我这里使用的SpringBoot 版本是 2.0.3.RE ...
- Spring @Import注解源码解析
简介 Spring 3.0之前,创建Bean可以通过xml配置文件与扫描特定包下面的类来将类注入到Spring IOC容器内.而在Spring 3.0之后提供了JavaConfig的方式,也就是将IO ...
- SpringBoot自动配置的源码解析
首先,写源码分析真的很花时间,所以希望大家转的时候也请注明一下,Thanks♪(・ω・)ノ SpringBoot最大的好处就是对于很多框架都默认的配置,让我们开发的时候不必为了大一堆的配置文件头疼,关 ...
- SpringBoot exception异常处理机制源码解析
一.Spring Boot默认的异常处理机制 1:浏览器默认返回效果 2:原理解析 为了便于源码跟踪解析,在·Controller中手动设置异常. @RequestMapping(value=&quo ...
- @RequesParam注解源码解析
- Spring源码解析系列汇总
相信我,你会收藏这篇文章的 本篇文章是这段时间撸出来的Spring源码解析系列文章的汇总,总共包含以下专题.喜欢的同学可以收藏起来以备不时之需 SpringIOC源码解析(上) 本篇文章搭建了IOC源 ...
- SpringBoot之DispatcherServlet详解及源码解析
在使用SpringBoot之后,我们表面上已经无法直接看到DispatcherServlet的使用了.本篇文章,带大家从最初DispatcherServlet的使用开始到SpringBoot源码中Di ...
随机推荐
- Bitmap缩放(一)
使用矩阵进行压缩,通过缩放图片尺寸,来达到压缩图片的效果,和采样率的原理一样.先用位图的option将位图压缩一半,再用matrix缩放0.3f public class MainActivity e ...
- SPI、I2C、I2S、UART、GPIO、SDIO、CAN、JTAG的区别及使用方法。
SPI 全称及由来:SPI接口的全称是"Serial Peripheral Interface",意为串行外围接口,是Motorola首先在其MC68HCXX系列处理器上定义的. ...
- DOM0级事件误区-addEventListener
百度上很多篇文章讲解addEventListener DOM0级事件的时候讲解的都是覆盖 概念如下: 同一个元素的同一种事件只能绑定一个函数,否则后面的函数会覆盖之前的函数 其实不然,官方讲解:添加的 ...
- php反序列化漏洞入门
前言 这篇讲反序列化,可能不会很高深,我之前就被反序列化整懵逼了. 直到现在我对反序列化还是不够深入,今天就刚好可以研究研究. 0x01.反序列化漏洞介绍 序列化在内部没有漏洞,漏洞产生是应该程序在处 ...
- Docker学习笔记之--.Net Core应用容器通过网桥连接Redis容器(环境:centos7)
上节演示通过应用容器连接sql server容器,连接:Docker学习笔记之--.Net Core项目容器连接mssql容器(环境:centos7) 本节演示安装 redis容器,通过网桥连接 先决 ...
- 深入了解Redis(8)-高可用方案
生产环境中的redis基本都是多节点部署,本文只讨论redis高可用的三种方案,不涉及实际操作. 一.主从复制(一主一从,一主多从,级联结构) (图来源于网络) 一个Master,两个Slave,Sl ...
- Pytest里面的测试用例怎么进行前置准备和后置清理操作?
Pytest处理前置后置有两种方式可以处理. 第一种是通过setup和teardown这样的方法去处理: 第二种是通过fixture来实现的.首先先定义fixture,然后在调用.定义fixture, ...
- 湖湘杯2020_ReMe
查壳后发现是由Python2.7环境下编译得到的exe可执行文件 由此想到可将exe转为pyc文件再反编译成py文件 且该方法只适用于py2 无混淆 因为py3的字节码结构有些许变化 step1: 在 ...
- ERROR: No matching distribution found for cv2
ImportError: No module named cv2和No matching distribution found for cv2的问题 原因 这个是由于没有导入opencv库导致的 解决 ...
- 【快速因数分解】Pollard's Rho 算法
Pollard-Rho 是一个很神奇的算法,用于在 $O(n^{\frac{1}4}) $的期望时间复杂度内计算合数 n 的某个非平凡因子(除了1和它本身以外能整除它的数).事书上给出的复杂度是 \( ...