SpringBoot原理-自动配置-Condition

news2024/11/19 5:43:32

目录

分析

通过获取 run() 的返回值再获取容器中的bean

@Conditional() 注解

解说案例

1.导入Jedis坐标后,加载该Bean,没导入,则不加载

思考

spring-boot-autoconfigure

condition包

ConditionalOnClass

ConditionalOnBean

ConditionalOnMissingBean

ConditionalOnProperty

data 包

2.将类的判断定义为动态的;判断哪个字节码文件存在可以动态指定

小结


  • Condition 是在 Spring 4.0 增加的条件判断功能
  • 通过这个功能可以实现选择性的创建 Bean 操作
  • 分析

  • 进入 SpringBoot 启动类,点击进入 run()
  • 可以看到这个方法是有返回值的,返回值为 ConfigurableApplicationContext
  • 这个返回值就是 IOC 容器
  • 通过获取 run() 的返回值再获取容器中的bean

  • 首先在 pom.xml 中导入 Redis 的起步依赖

  • 在启动类中编写获取 redisTemplate 代码

  • @Conditional() 注解

  • Spring 在创建 Bean 时,可以在方法上添加条件注解 @Conditional()
  • 里面 Condition 就是核心的条件接口
  • 接口中只有一个 matches() 方法,返回值为 boolean 类型
  • 所以要使用 @Conditional() 注解就需要在注解中传入一个 Condition 条件接口的实现类
  • 并且实现类要复写 matches() ,返回 true 或者 false
    • 如果返回的是 true,那么对应的 Bean 将会被 Spring 容器创建
    • 如果返回的是 false,那么容器则不会创建对应的 Bean
  • 解说案例

  • 在Spring的IOC容器中有一个User的Bean,现要求:
  • 1.导入Jedis坐标后,加载该Bean,没导入,则不加载

  • 如果把 pom.xml 文件中的 Jedis 坐标注释掉
  • 那么Spring 容器则不会创建 User 对应的 Bean,运行启动类就获取不到 user 对象
  • 思考

  • 根据之前在启动类中编写的获取redisTemplate 的代码
  • SpringBoot 是如何知道要创建RedisTemplate 的?
  • 其实 SpringBoot 就是使用 Condition 去判断当前环境中有没有导入 Redis 的 start,如果导入了,那么就会创建 RedisTemplate
  • spring-boot-autoconfigure

  • 在 SpringBoot 中提供了非常多的 ConditionalOn* 的类
  • 可以在 External Libraries 中找到 spring-boot-autoconfigure 这个 SpringBoot 的自动配置 jar 包
  • 其中有一个 condition 包,可以看到这个包里有很多 ConditionalOn*
  • condition包

  • 拿几个讲下
  • ConditionalOnClass

  • 进入 ConditionalOnClass 中可以看到,他里面定义了一个注解
  • 注解上面有一个 @Conditional,value 值为 OnClassCondition.class
  • 这个操作就是在判断是否有对应的字节码文件

  • ConditionalOnBean

  • 当 IOC 容器中有指定 Bean 的时候,才会去初始化指定的 Bean

  • ConditionalOnMissingBean

  • 当 IOC 容器中没有指定 Bean 的时候,才会去初始化指定的 Bean

  • ConditionalOnProperty

  • 当配置文件中配置了指定的属性,才会创建某一个 Bean

  • data 包

  • data 包中有一个 redis 的包
  • redis 有一个配置类为 RedisAutoConfiguration,如图可以看到这个配置类在初始化 RedisTemplate
  • 并且有一些初始化的条件:
  • @ConditionalOnClass(RedisOperations.class)
  • 在当前环境中需要有 RedisOperations 字节码存在,才能去创建下面方法的 Bean
  • (因为这个注解是加在类上的,所以下面所有的方法都要满足这个条件才可以创建 Bean)
  • @ConditionalOnMissingBean(name = “redisTemplate”)
  • 可以看到在 redisTemplate 方法上添加了一个这样的注解
  • 它代表如果当前环境中不存在 redisTemplate,才会创建 RedisTemplate
  • 如果存在,那就证明我们自己定义了 RedisTemplate,则不会创建

  • 2.将类的判断定义为动态的;判断哪个字节码文件存在可以动态指定

  • 去自定义一个注解来实现动态导入指定值判断是否创建Bean
  • 小结

  • 介绍了来由与自定义的条件以及 SpringBoot 提供的常用条件注解
  • 自定义条件
    • 1.定义条件类:
    • 自定义类实现 Condition 接口,重写 matches 方法
    • 在 matches 方法中进行逻辑判断,返回 boolean 值
    • matches 方法两个参数:
      • context:上下文对象,可以获取属性值、类加载器、BeanFactory 等
      • metadata:元数据对象,用于获取注解属性
    • 2.判断条件:在初始化 Bean 时,使用 @Conditional(条件类.class) 注解
  • SpringBoot 提供的常用条件注解
    • ConditionalOnProperty:判断配置文件是否有对应的属性和值才初始化 Bean
    • ConditionalOnClass:判断环境中是否有对应的字节码文件才初始化 Bean
    • ConditionalOnMissingBean:判断环境中没有对应 Bean 才初始化 Bean

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/163512.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python【bs4模块】讲解

导入:from bs4 import BeautifulSoup#爬取某豆的电影榜单 import pprint import requests from bs4 import BeautifulSoup class pachong:#pass #这段代码的意思如果暂时没有想好在类中定义任何属性和方法,你可以先写pass Python就会认为这段不会运行直接…

基于GeoDa软件的省级人口经济空间分析

前言本为从地统计学角度,借助空间自相关的方法,从县域尺度,研究江西省各县经济发展水平之间的相关关系,及经济发展与人口之间的相关关系,直观的说明江西省2000年的经济发展状况。通过对各市第一、第二、第三产业的GDP等…

Servlet总结(未完待续)

Servlet总结一. 简介二. Servlet执行流程三. 生命周期四. 体系结构五. urlPattern配置匹配规则六. Request和Response1. Request1.1 Request继承体系1.2 Request获取请求数据API1.3 通用方式获取请求参数1.4 通用方式中文乱码解决1.5 Request请求转发2.1 Response一. 简介 Ser…

轻量级 Java 权限认证框架——Sa-Token

Sa-Token 介绍 Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。 Sa-Token最新开发文档地址:https://sa-token.cc Sa-Token功能结构图…

MySQL最左匹配原则

说到最左匹配原则,我们还得先从组合索引说起。 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS user; CREATE TABLE user (id int(5) NOT NU…

【Java AWT 图形界面编程】LayoutManager 布局管理器 ⑥ ( BoxLayout 布局 )

文章目录一、BoxLayout 布局二、BoxLayout 布局 API三、BoxLayout 布局代码示例1、BoxLayout 布局垂直排列代码示例2、BoxLayout 布局水平排列代码示例一、BoxLayout 布局 BoxLayout 布局 不是 AWT 中的布局 , 而是 Swing 中引入的 ; 在 BoxLayout 布局 中 , 可以 在 垂直 和 …

[Effective Objective] 对象、消息、运行期

对象:“对象”(object)就是“基本构造单元”(building block),开发者可以通过对象来储存并传递数据。 消息:在对象之间传递数据并执行任务的过程就叫做“消息传递”(Messaging)。 运行期&…

最粗暴的方法实现一个栈

对于栈和队列是一个很简单的知识,用的感觉也不是很多,但是,我们仍然的学习!!加油!!在实现最简单的栈之前,我们需要简单了解一下栈是什么??栈(stac…

iplatform平台简介

前置条件:原则规范一)统一技术栈1)关于JDK统一使用Open JDK,版本最低1.8,几年后可能会升级到17;避免使用Sun JDK,这是商业软件,而且包含部分私有(com.sun)类库…

pandas 实战:分析三国志人物

简介 背景 Pandas 是 Python 的一个工具库,用于数据分析。由 AQR Capital Management 于 2008 年 4 月开发,2009 年开源,最初被作为金融数据分析工具而开发出来。Pandas 名称来源于 panel data(面板数据)和 Python d…

基于SEIR模型的传染病预测软件开发(完整代码+数据集+报告)

1 操作页面及用户使用说明(1) 界面说明App页面主要分为4个区域,分别是:曲线显示区、模型初始化和预防参数设定区、传染病特征参数设定区、绘图控制区。① 曲线显示区:显示模型预测的不同人数量随时间的变化曲线。② 模型初始化和预防参数设定…

泛函分析中的向量空间

一、向量空间背景 (1) 具有如下点内积或标量内积的实数域RRR上的欧式空间RNR^NRN: ⟨u,v⟩uTvu0v0u1v1⋯uN−1vN−1∑i0N−1uivi\langle\boldsymbol{u}, \boldsymbol{v}\rangle\boldsymbol{u}^{\mathrm{T}} \boldsymbol{v}u_{0} v_{0}u_{1} v_{1}\cdotsu_{N-1} v_{…

SpringCloud-Netflix学习笔记——微服务和微服务架构

一、什么是微服务? 什么是微服务?微服务(Microservice Architecture)是近几年流行的一种架构思想,关于它的概念很 难一言以蔽之。究竟什么是微服务呢?我们在此引用 ThoughtWorks 公司的首席科学家 Martin F…

谷粒商城-高级篇-Day11-商城业务

文章目录整合thymeleaf渲染页面页面修改不重启服务器实时更新渲染二三级数据nginx-搭建域名访问环境一nginx-搭建域名访问环境二整合thymeleaf渲染页面 将index放到product的资源下的static目录&#xff0c;index.html放到templates文件夹下 导入thymeleaf <!-- 模板引擎…

【Acwing寒假2023每日一题】4700. 何以包邮?- 01背包dp至少模板

4700. 何以包邮&#xff1f; - AcWing题库 设满x元包邮&#xff0c;题目要求总价值至少x的最小价值 目录 1、一维 01背包-至少模板 至少模板和至多模板的两大区别 2、二分 二维 01背包-至多模板 &#xff08;1&#xff09;二维dp 3、逆向思维 一维 01背包-至多模板 1…

1.环境搭建 创建spring boot 项目(mac)

1.安装maven 首先你需要在maven官网上下载mac专用的二进制maven压缩包。也就是下图的这个&#xff1a; 然后&#xff0c;开始我们的配置。 1、打开终端&#xff0c;输入这个代码&#xff1a; vim ~/.bash_profile 2、然后点击键盘上的“i”&#xff0c;进入vim编辑模式&…

【BBuf的CUDA笔记】五,解读 PyTorch index_add 操作涉及的优化技术

本文把pytorch index_add算子的代码抽取出来放在&#xff1a;https://github.com/BBuf/how-to-optim-algorithm-in-cuda/blob/master/indexing/index_add_cuda_pytorch_impl.cu 。如果不太熟悉PyTorch的话也可以直接看这个.cu文件&#xff0c;有问题请在这个repo提issue。 0x0.…

2022,我感受到了CSDN不平凡

最初注册CSDN&#xff0c;只是因为老师的要求&#xff0c;负责教C课程的老师让同学们注册CSDN&#xff0c;并经常更新自己的博客。虽然注册了CSDN的博客&#xff0c;也写了几篇博客文章&#xff0c;可最初我并不理解老师为什么要让我们注册&#xff0c;可是随着在CSDN驻留时间的…

运行时数据区

目录 一、概述 1.1、数据区 1.2、JAVA线程数据区 二、线程 2.1、JVM线程概述 2.2、JVM系统线程 三、PC寄存器 3.1、寄存器概述 3.2、作用 3.3、常见问题 一、概述 1.1、数据区 内存是非常重要的系统资源&#xff0c;是硬盘和CPU的中间仓库及桥梁&#xff0c;承载着操…

vulnhub DC系列 DC-5

总结&#xff1a; 下载地址 DC-5.zip (Size: 521 MB)Download: http://www.five86.com/downloads/DC-5.zipDownload (Mirror): https://download.vulnhub.com/dc/DC-5.zip使用方法:解压后&#xff0c;使用vm直接打开ova文件。 漏洞利用 信息收集 这里还是使用DC-1的方法 1.给靶…