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 ...
随机推荐
- Linux常用系统文件目录结构
Linux常用系统文件目录结构 bin:全称binary,含义是二进制.该目录中存储的都是一些二进制文件,文件都是可以被运行的. dev:该目录主要存放的是外接设备,例如硬盘.其他的光盘等.在其中的外 ...
- java数据结构-11循环双端队列
@SuppressWarnings("unchecked") public class CircleDeque<E> { private int front; priv ...
- CPU上下文
CPU上下文 包括CPU寄存器和程序计数器(Program Counter,PC). CPU寄存器,是CPU内置的容量小.但速度极快的内存. 程序计数器,是用来存储CPU正在执行的指令位置.或者即将执 ...
- Java中的微信支付(2):API V3 微信平台证书的获取与刷新
1. 前言 在Java中的微信支付(1):API V3版本签名详解一文中胖哥讲解了微信支付V3版本API的签名,当我方(你自己的服务器)请求微信支付服务器时需要根据我方的API证书对参数进行加签,微信 ...
- CodeForces 1420E Battle Lemmings
题意 略. \(\texttt{Data Range:}1\leq n\leq 80\) 题解 首先考虑初始状态怎么算答案.很明显直接数满足的不好数,用总的减去不满足的还比较好做.注意到所有不满足的是 ...
- STM32入门系列-存储器与寄存器介绍
介绍两部分内容: 什么是存储器映射 什么是寄存器及寄存器映射 为了让大家对存储器与寄存器有一个更清楚的认识,并且为之后使用 C 语言来访问 STM32 寄存器内容打下基础.等明白了如何使用 C 语言封 ...
- openshift 平台上部署 gitlab代码仓库服务
背景: 本文档将以在openshift 平台上部署 gitlab 服务来验证集群各个服务组件的可用性以及熟悉openshift的使用方法.服务部署方式可以多种多样,灵活部署.本篇以常见的镜像部署方式来 ...
- xlwt模块,(Excel表格)
1. 安装模块 #pip install xlwt 2. 简单例子打印excel import xlwt # 创建一个workbook 设置编码 workbook = xlwt.Workbook(en ...
- MySQL图形界面客户端
图形界面客户端 使用图形界面客户端操作数据库更直观.方便.下面三个客户端都能操作MySQL,各有各自的优点. 1.Navicat Premium 下载安装包下载 关注公众号[轻松学编程],然后回复[n ...
- 一路踩坑,被迫聊聊 C# 代码调试技巧和远程调试
一:背景 1. 讲故事 每次项目预交付的时候,总会遇到各种奇葩的坑,我觉得有必要梳理一下以及如何快速解决的,让后来人避避坑,这篇就聊聊自己的所闻所遇: 我去,本地环境代码跑的哧溜,上了测试环境出问题 ...