SpringBoot学习(8)(Bean注册条件)(@Conditional的衍生注解)

news2024/9/25 3:27:17

目录

一、引言

二、案例引用(接着上篇博客)

三、注册条件

(1)@ConditionalOnProperty

(2)Conditional0nMissingBean

(3)@ConditionalOnclass

四、总结

一、引言

  • 之前学习和了解了Bean对象的注册。其中涉及注解有@Bean@Import
  • Bean管理的第三个部分——>注册条件

二、案例引用(接着上篇博客)

  • 接着上篇博客的学习,我想获取第三方jar包中实体类的对应的已经注入到Ioc容器的Bean对象的具体成员变量的值
  • 这里用到注解@Value。把配置文件里面的信息读取程序里面使用。因为在程序中不能把信息写死了。而这个注解可以获取配置文件里的指定键对应的值之前它用在成员变量上了,现在它也可以用在参数列表上


@Value("${country.对应键名}")


  • yml配置文件中的内容

  • 如果我把配置文件里面的内容注释掉,再重新启动运行工程就会报错。因为前面用注解告诉springboot从配置文件里面读取(country.name与country.system),结果删除了就不能解析到它。
  • 而我们正常的设置应该是这样:如果配置文件里面书写了对应的内容,就正常解析。如果没有写任何的东西,就不再注入country对象。如何做?这就要用到注册条件了。

三、注册条件

  • SpringBoot提供了设置注册生效条件的注解@Conditional。我们可以借助于这个注解来设置Bean注册的条件,但是这个注解比较麻烦。所以要使用其更简单的衍生注解

  • 这类衍生的注解有很多,以下列出三个常用的注解以及说明
@Conditional的常用衍生注解
注解说明
@ConditionalOnProperty配置文件中存在对应的属性,才声明该bean
@Conditional0nMissingBean当不存在当前类型的bean时,才声明该bean
@ConditionalOnclass当前环境存在指定的这个类时,才声明该bean
  • 回到IDEA继续尝试使用上述衍生注解
(1)@ConditionalOnProperty

配置文件中存在对应的属性,才声明该bean

  • 首先使用注解@ConditionalOnProperty,这个注解有两个属性需要赋值。


  • 添加这个注解后(如果没有前缀country,name属性是指定键名,也就是country下有name、system都配置好了才注入Country类的Bean对象,否则不注入)

 
  • 此时再去启动类中获取并打印这个Bean对象就报错,因为前面注解判断条件生效,并没有注入进Ioc容器(测试成功)只要把配置文件的注释取消掉,再重新运行就可以了。

(2)Conditional0nMissingBean

当不存在当前指定类型的Bean时,才声明和注入该Bean

  • 测试如果Ioc容器中不存在已经注入好的Country,则注入Province,否则不注入
  • 首先前面yml配置文件注释去掉,然后Country已经注入到Ioc容器中




  • 此时再把yml配置文件中的内容注释掉,这样就会因为注解@ConditionalOnProperty的注册条件生效,就不会注册Country的Bean对象。然后又因为注解@Conditional0nMissingBean的原因,判断条件生效,没有已经注入的Country就会注册Province的Bean对象,然后springboot的启动类就可以获取到Ioc容器里面的Province的Bean对象了。

(3)@ConditionalOnclass

当前环境存在指定的这个类时,才声明该bean

  • 测试:如果当前环境中存在:"DispatcherServlet类",则注入Province,否则不注入。而这个类"DispatcherServlet"是当工程引入了web的起步依赖,则当前环境中会存在这个类,否则就没有。
  • 首先我的pom文件里面并没有引入web的起步依赖。
  • 然后我在使用这个注解@ConditionalOnclass的时候,要写指定类的全类名——>对应的一个属性值要声明"name"。这里采用双击shift,搜索全类名,像下面一样的操作步骤



  • 如果没有web的起步依赖,就没有上面那个类DispatcherServlet

  • 然后接下来用注解注册Bean的判断条件,如果环境中存在这个类,就注册Province的Bean对象。

  • 显而易见会报错!!因为未引入web起步依赖,环境中不存在该类,它就获取不到Ioc容器中的Province的Bean对象

  • 现在测试当pom文件中引入了web的起步依赖,记得刷新Maven。就成功了,不报错!


四、总结

(1)学习的有关于Bean注册条件的相关注解,通常会在自定义starter、或者是学习springboot源码中看到。

(2)主要涉及到的相关注解:@Bean、自定义组合注解@Conditional及其衍生注解:@ConditionalOnProperty@Conditional0nMissingBean@ConditionalOnclass

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

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

相关文章

相亲交友系统商业开发

在快节奏的现代生活中,寻找真爱成为了许多人的渴望。相亲交友系统,作为连接心灵的桥梁,正逐渐成为人们寻找伴侣的首选方式。我们的团队h17711347205致力于开发一款创新的相亲交友系统,旨在通过智能化的匹配算法,为用户…

出门总是一身猫毛怎么办?霍尼韦尔、希喂、352、小米宠物空气净化器对比实测

毕业了好些年,前段时间有同学组织了聚会,聚一聚,我们班的专业本身就和动物有关,聊天自然而然聊到了宠物上去,有个同学打趣:“有没有养猫狗看看衣服就知道了”。还真是家里养了宠物的,无论咋清理…

电子商务小程序如何做seo

电子商务小程序进行SEO(搜索引擎优化)是一个综合性的过程,旨在提高小程序在搜索引擎中的排名,从而增加曝光度和用户流量。以下是一些关键的SEO策略和实践方法: 电子商务小程序如何做seo 1. 关键词研究与布局 关键词选…

第十七篇:TCP协议介绍(1)

1.TCP 的概念 传输控制协议(Transmission Control Protocol,TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在 TCP 协议中,通过三次握手建立连接。通信结束后,还需要断开连接。如果在发送数据包时&…

视频安防监控LntonAIServer安防管理平台抖动检测和过亮过暗检测

随着视频监控技术的发展,视频质量成为确保监控系统有效性的重要因素。LntonAIServer通过引入抖动检测与过亮过暗检测功能,进一步提升了视频监控系统的可靠性和用户体验。这些功能可以帮助及时发现并解决视频流中的质量问题,确保视频监控系统始…

数字广告监管者对高风险行业的打压,但是否应该...

不言而喻,如果你从事的是某些类型产品的推广业务,你需要格外小心。不懂我们的意思?那你算幸运了。我们指的是那些被归类为 高风险行业 的消费品或商业产品。 高风险行业是那些相较于其他行业“面临更多运营、监管和声誉风险”的行业。不完全列…

基于51单片机的倒计时装置proteus仿真

地址: https://pan.baidu.com/s/1p9xDKXaulyx-PyP6dURp-g 提取码:1234 仿真图: 芯片/模块的特点: AT89C52/AT89C51简介: AT89C52/AT89C51是一款经典的8位单片机,是意法半导体(STMicroelectro…

[SwiftUI 开发] 构建带有动画的图片瀑布流效果

在移动应用程序中,图片瀑布流布局是一种常见的设计模式,它不仅能够以网格的形式显示大量图片,还能允许用户点击图片进行全屏查看。 在下文中,将详细介绍如何使用 SwiftUI 构建一个带有点击动画效果的图片瀑布流布局,并…

B站视频下载教程

文章目录 1.确保浏览器下载了tampermonkey(油猴)2.下载插件3.下载mtorix4.浏览器刷新并下载视频 1.确保浏览器下载了tampermonkey(油猴) 至于这个步骤可以自行搜索一下很简单,讲油猴固定在状态栏,显示如下 2.下载插件 1.进入greasyFork 2.搜索B站视…

【Unity-Lua】音乐播放器循环滚动播放音乐名

前言:Unity中UI节点 图1 如上所示,一开始本来是打算用ScrollView做的,觉得直接计算对应的文本位置就行,所以没用ScrollRect来做,可以忽略Scroll,Viewport这些名字。如下图:需要在一个背景Image…

多级别分销平台怎么做 千店系统设计关键要点

创建多级别分销平台可以帮助企业拓展市场并激励分销商,多级别分销商城的良好设计可以助力企业的营销事半功倍。今天,商淘云为您分享千店系统设计的三大关键要点。 首先,选择合适的平台和技术工具至关重要。使用像商淘云供应链这样的电商平台&…

睿赛德科技携手先楫共创RISC-V生态|RT-Thread EtherCAT主从站方案大放异彩

日前,在先楫HPM6E00技术日上,睿赛德科技(RT-Thread)向广大工业用户展示了多年来双方在RISC-V生态领域的合作历程和成果,同时睿赛德科技携手先楫半导体首次推出了基于HPM6800处理器的EtherCAT主站解决方案,吸…

Uniapp + Vite + Vue3 + uView + Pinia 实现自定义底部 Tabbar(最新保姆级教程)

Uniapp Vite Vue3 uView Pinia 实现自定义底部 Tabbar(最新保姆级教程) 1、效果展示2、环境准备2.1 新建 uniapp 项目2.2. 安装 uView2.3 安装 pinia 3. 配置环境4. 创建目录结构5、编写 pages.json 页面路由6、编写 tabbar.js 状态数据7、编写 tabb…

Java-IDEA模拟一个Redis服务器,与Redis客户端进行一次简单的交互。默认端口号:6379

首先要了解Redis的交互协议。 摘抄: 简单字符串(Simple Strings): 以 “” 开头,例如 “OK\r\n” 表示一个成功的响应。错误(Errors): 以 “-” 开头,例如 “-ERR unknown command\r\n” 表示一…

操作系统概述及特征

(较为浅显的了解操作系统,适合小白); 目录 1. 操作系统概述 1.1 操作系统 1.2 系统软件 1.3 主要作用 2. 操作系统的特征 ​编辑 2.1 并发性​编辑 2.2 并行​编辑 2.3 共享性 2.3.1 共享概述 2.3.2 共享与并发的关系…

【机器学习】朴素贝叶斯网络的基本概念以及朴素贝叶斯网络在python中的实例

引言 文章目录 引言一、朴素贝叶斯网络1.1 基本概念1.1.1 节点1.1.2 边(Edges)1.1.3 条件独立性 1.2 特点1.2.1 结构简单1.2.2 易于理解和实现1.2.3 计算效率高 1.3 应用1.4 数学表示1.5 局限性 二、朴素贝叶斯网络在python中的实例2.1 实例背景2.2 实现…

LangChain 最新版入门实战-v0.2

LangChain 基础入门文档 1. 认识 LangChain LangChain 是一个基于大型语言模型(LLM)的应用开发框架。它通过两种方式规范和简化了使用大型语言模型的方式: 集成:让语言模型能够使用更多的信息。 代理:让语言模型能够…

Linux 磁盘增加分区并挂载

说明 目的:该篇文章主要是实操后为了备忘 原因:为了方便,直接使用已有模板创建了虚拟机。没想到创建的新机器给了300G磁盘,实际只有2个分区且只使用了100G。以下为我实操后成功增加分区并挂载的步骤。 增加分区 指定操作对象&a…

如何快速写文献综述

真实参考文献的AI论文生成器:AIPaperDone - AI 万字论文生成 在本文中,你将学习如何为不同的学术领域撰写文献综述。 请注意: 文献综述并不是关于小说或诗歌等文学作品的。当我们说"文献",我们指的是某个领域的"研究"。撰写文献综述意味着收集…

【鸿蒙】HarmonyOS NEXT星河入门到实战3-ArkTS界面起步开发

目录 一、界面开发布局思路 二、组件的属性方法 三、字体颜色 四、文字溢出省略号、行高 五、Image图片组件 六、输入框与按钮 七、综合实战- 华为登录 八、设计资源-svg图标 前言:HarmonyOS NEXTArkTS界面开发起步。开发工具:仍然是 DevEco Studio 学习界面…