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. BrowserSync 热更新的使用(保存后自动刷新)

    BrowserSync使用的优点,BrowserSync监听条件中的文件,发现更新会立刻刷新浏览器,就像 vue中的热更新一样,解放F5实现自动更新,提高开发效率, 解决了使用双屏幕时来回切换的烦恼! ...

  2. java前后端开发需掌握的框架及技术

    一.Java开发 1.J2EE架构及主流框架,spring4.spring boot.spring MVC.spring Security.spring cloud.struct2.hibernate ...

  3. 2. HttpRunnner录制生成用例

    录制生成用例 为了简化测试用例的编写工作,HttpRunner 实现了测试用例生成的功能,对应的转换工具为一个独立的项目:har2case. 简单来说,就是当前主流的抓包工具和浏览器都支持将抓取得到的 ...

  4. OAuth2 快速入门

    1 OAuth简述 OAuth 2.0 是一个授权协议,它允许软件应用代表(而不是充当)资源拥有者去访问资源拥有者的资源.应用向资源拥有者请求授权,然后取得令牌(token),并用它来访问资源,并且资 ...

  5. ucore操作系统学习(四) ucore lab4内核线程管理

    1. ucore lab4介绍 什么是进程? 现代操作系统为了满足人们对于多道编程的需求,希望在计算机系统上能并发的同时运行多个程序,且彼此间互相不干扰.当一个程序受制于等待I/O完成等事件时,可以让 ...

  6. [CF160D]Edges in MST (最小生成树+LCA+差分)

    待填坑 Code //CF160D Edges in MST //Apr,4th,2018 //树上差分+LCA+MST #include<cstdio> #include<iost ...

  7. Linux开机启动顺序启动顺序及配置开机启动

    Linux:开机启动顺序启动顺序及配置开机启动 开机启动顺序 1.加载内核 2.启动 init(/etc/inittab) pid=1 3.系统初始化 /etc/rc.d/rc.sysinit 4.运 ...

  8. ubuntu常见问题有效解决办法

    1.关于weget "无法建立SSL连接"的解决方法 wget在使用HTTPS协议时,默认会去验证网站的证书,而这个证书验证经常会失败. 解决办法 原命令加上"--no- ...

  9. Shell 筛选符合条件的 ELF 文件

    0 运行环境 本机系统:Windows 10 虚拟机软件:Oracle VM VirtualBox 6 虚拟机系统:Ubuntu 18 1 引言 - 编译过程 我们知道在 CPU 上执行的是低级别的机 ...

  10. 回流与重绘:CSS性能让JavaScript变慢?

    参考张鑫旭博客: http://www.zhangxinxu.com/wordpress/2010/01/%E5%9B%9E%E6%B5%81%E4%B8%8E%E9%87%8D%E7%BB%98%E ...