springboot自动配置的条件注解使用

1.@ConditionalOnBean

@Configuration
public class MyConfiguration {@Beanpublic MyBean myBean() {return new MyBean();}@Bean@ConditionalOnBean(MyBean.class)public AnotherBean anotherBean() {return new AnotherBean();}
}

在这个例子中:

  • MyConfiguration 是一个配置类。
  • myBean() 方法定义了一个类型为 MyBean 的 bean。
  • anotherBean() 方法使用了 @ConditionalOnBean(MyBean.class) 注解,这意味着它定义的 bean (AnotherBean) 只有在上下文中存在 MyBean 类型的 bean 时才会被创建。

如果 MyBean 不存在,anotherBean() 就不会被创建。这是一种根据上下文中是否存在特定 bean 有条件地配置应用程序的方法。

2.@ConditionalOnClass

@Configuration
@ConditionalOnClass(name = "org.springframework.web.servlet.DispatcherServlet")
public class MyConfiguration {@Beanpublic MyBean myBean() {return new MyBean();}
}

在这个例子中:

  • MyConfiguration 是一个配置类。
  • @ConditionalOnClass(name = “org.springframework.web.servlet.DispatcherServlet”) 表示只有当类路径中存在名为 org.springframework.web.servlet.DispatcherServlet 的类时,该配置才会生效。
  • 如果指定的类不存在于类路径中,那么配置类中定义的 bean (MyBean) 将不会被创建。

3.@ConditionalOnExpression

SpEL表达式

  1. 访问属性和方法:
    • 通过使用点号 . 来访问对象的属性和调用方法。例如,person.name 表示访问 person 对象的 name 属性。
  2. 索引和集合:
    • 使用 [] 来访问数组和集合。例如,myArray[0] 表示访问数组的第一个元素。
  3. 运算符:
    • SpEL 支持各种运算符,包括算术运算符、逻辑运算符、比较运算符等。
  4. 条件运算符:
    • SpEL 支持三元条件运算符,例如,condition ? trueValue : falseValue
  5. 正则表达式匹配:
    • SpEL 提供了 matches 运算符,可以用于正则表达式匹配。
  6. 类型:
    • SpEL 具有类型转换的功能,你可以在表达式中进行类型转换,例如,(int) ‘42’ 表示将字符串转换为整数。
  7. 集合选择和投影:
    • SpEL 支持在集合上进行选择和投影操作。例如,users.?[age > 21] 表示选择年龄大于 21 的用户。
  8. 注入 Bean:
    • 在 Spring 中,可以使用 @Value 注解和 SpEL 表达式来注入 bean 的属性。例如,@Value(“#{myBean.property}”)
  9. 使用环境变量:
    • SpEL 允许使用 #{systemProperties[‘property.name’]}#{systemEnvironment[‘env.variable’]} 的方式来引用系统属性或环境变量。
  10. 在注解中使用:
  • SpEL 可以在注解中使用,例如,在 @ConditionalOnExpression@Value 等注解中。
myapp.feature.enabled=true
@Configuration
@ConditionalOnExpression("${myapp.feature.enabled:true}")
public class MyConfiguration {@Beanpublic MyBean myBean() {return new MyBean();}
}

4.@ConditionalOnJava

@Configuration
@ConditionalOnJava(range = ConditionalOnJava.Range.EQUAL_OR_NEWER, value = JavaVersion.EIGHT)
public class MyConfiguration {@Beanpublic MyBean myBean() {return new MyBean();}
}

在这个例子中:

  • MyConfiguration 是一个配置类。
  • @ConditionalOnJava(range = ConditionalOnJava.Range.EQUAL_OR_NEWER, value = JavaVersion.EIGHT) 表示只有当运行应用程序的 JVM 版本等于或新于 Java 8 时,该配置才会生效。
  • 如果 JVM 版本不满足条件,配置类中定义的 bean (MyBean) 将不会被创建。

5.@ConditionalOnJndi

@Configuration
@ConditionalOnJndi("java:comp/env/jdbc/myDataSource")
public class MyConfiguration {@Beanpublic MyDataSource myDataSource() {// Configuration for the DataSourcereturn new MyDataSource();}
}

在这个例子中:

  • MyConfiguration 是一个配置类。
  • @ConditionalOnJndi(“java:comp/env/jdbc/myDataSource”) 表示只有当 JNDI 中存在名为 java:comp/env/jdbc/myDataSource 的条目时,该配置才会生效。
  • 如果 JNDI 条目不存在,配置类中定义的 bean (MyDataSource) 将不会被创建。

6.@ConditionalOnMissingBean

@Configuration
public class MyConfiguration {@Bean@ConditionalOnMissingBeanpublic MyBean myBean() {return new MyBean();}
}

在这个例子中:

  • MyConfiguration 是一个配置类。
  • @Bean 方法上使用了 @ConditionalOnMissingBean 注解,表示只有当类型为 MyBean 的 bean 不存在于 Spring 上下文中时,才会创建该 bean。
  • 如果已经有一个类型为 MyBean 的 bean 存在于上下文中,那么该方法不会执行,避免了重复创建相同类型的 bean。

7.@ConditionalOnMissingClass

@Configuration
@ConditionalOnMissingClass("com.example.ExampleClass")
public class MyConfiguration {@Beanpublic MyBean myBean() {return new MyBean();}
}

在这个例子中:

  • MyConfiguration 是一个配置类。
  • @ConditionalOnMissingClass(“com.example.ExampleClass”) 表示只有当类路径上不存在名为 com.example.ExampleClass 的类时,该配置才会生效。
  • 如果指定的类存在于类路径上,配置类中定义的 bean (MyBean) 将不会被创建。

8.@ConditionalOnNotWebApplication

@Configuration
@ConditionalOnNotWebApplication
public class MyConfiguration {@Beanpublic MyBean myBean() {return new MyBean();}
}

在这个例子中:

  • MyConfiguration 是一个配置类。
  • @ConditionalOnNotWebApplication 表示只有当应用程序不是Web应用程序时,该配置才会生效。
  • 如果应用程序是Web应用程序,配置类中定义的 bean (MyBean) 将不会被创建。

9.@ConditionalOnProperty

@Configuration
@ConditionalOnProperty(name = "myapp.feature.enabled", havingValue = "true")
public class MyConfiguration {@Beanpublic MyBean myBean() {return new MyBean();}
}

在这个例子中:

  • MyConfiguration 是一个配置类。
  • @ConditionalOnProperty(name = “myapp.feature.enabled”, havingValue = “true”) 表示只有当配置属性 myapp.feature.enabled 的值为 “true” 时,该配置才会生效。
  • 如果配置属性不存在或者值不是 “true”,配置类中定义的 bean (MyBean) 将不会被创建。

你可以使用 name 指定配置属性的名称,havingValue 指定期望的属性值,还可以通过 matchIfMissing 指定当配置属性不存在时是否匹配,默认值为 false

10.@ConditionalOnResource

@Configuration
@ConditionalOnResource(resources = "myconfig.properties")
public class MyConfiguration {@Beanpublic MyBean myBean() {return new MyBean();}
}

在这个例子中:

  • MyConfiguration 是一个配置类。
  • @ConditionalOnResource(resources = “myconfig.properties”) 表示只有当类路径上存在名为 myconfig.properties 的资源文件时,该配置才会生效。
  • 如果指定的资源文件不存在,配置类中定义的 bean (MyBean) 将不会被创建。

11.@ConditionalOnSingleCandidate

@Configuration
public class MyConfiguration {@Bean@ConditionalOnSingleCandidate(MyService.class)public MyBean myBean(MyService myService) {return new MyBean(myService);}
}

在这个例子中:

  • MyConfiguration 是一个配置类。
  • @Bean 方法上使用了 @ConditionalOnSingleCandidate(MyService.class) 注解,表示只有当类型为 MyService 的 bean 在 Spring 上下文中有且只有一个候选者时,才会创建该 bean。
  • 如果有多个或者一个都没有符合条件的 MyService 类型的 bean,那么配置类中定义的 bean (MyBean) 将不会被创建。

12.@ConditionalOnWebApplication

@Configuration
@ConditionalOnWebApplication
public class MyWebConfiguration {@Beanpublic MyWebBean myWebBean() {return new MyWebBean();}
}

在这个例子中:

  • MyWebConfiguration 是一个配置类。
  • @ConditionalOnWebApplication 表示只有当应用程序是 Web 应用程序时,该配置才会生效。
  • 如果应用程序不是 Web 应用程序,配置类中定义的 bean (MyWebBean) 将不会被创建。

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

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

相关文章

QT入门篇---无门槛学习

1.1 什么是 Qt Qt 是⼀个 跨平台的 C 图形⽤⼾界⾯应⽤程序框架 。它为应⽤程序开发者提供了建⽴艺术级图形界⾯所需的所有功能。它是完全⾯向对象的,很容易扩展。Qt 为开发者提供了⼀种基于组件的开发模式,开发者可以通过简单的拖拽和组合来实现复杂的…

车险到期提醒,快速查询交强险投保日期!

随着社会的进步和人们生活水平的提高,车辆已经成为人们出行的重要工具。而为了保障行车安全,车辆保险成为了必备的选择。交强险作为一种强制性的保险,其投保期限对车主来说尤为重要。本文将通过介绍一个API接口,帮助车主们快速查询…

安全合规之漏洞扫描的重要意义

随着信息技术的飞速发展,企业在日常运营中越来越依赖于网络和数字化系统。然而,随之而来的是网络安全威胁的不断增加,给企业的数据和运营带来了巨大的风险。为了保护企业的资产和数据,企业需要积极采取措施来确保网络的安全性和合…

图中点的层次——树与图的广度优先遍历

问题描述 代码实现 #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N 1e5 10;int n, m; int h[N], ne[N * 2], e[N * 2], idx; int d[N]; // 从节点1到当前节点的距离 int q[N * 2]; // 数组模拟队列void ad…

01-echarts如何绘制三维折线图

echarts如何绘制三维折线图 一、相关依赖包1、下载依赖2、引入依赖 二、创建图表盒子1、创建盒子2、定义数据3、编写方法1、初始化盒子2、设置配置项3、修改数据格式4、设置颜色数组4、设置name数组5、设置线三维和点三维6、添加配置项7、设置图表自适应 4、调用方法 三、整体代…

Unity 面试篇|(三)设计模式篇 【全面总结 | 持续更新 | 建议收藏】

目录 1. 什么是设计模式&#xff1f;2. 设计模式的七大原则&#xff1f;3. 单例模式4. 三类设计模式5. 什么是单例模式&#xff0c;适用场景以及优缺点&#xff1f;6. 什么是原型模式&#xff0c;适用场景以及优缺点&#xff1f;7. 什么是生成器模式&#xff0c;适用场景以及优…

低代码配置-小程序配置

数据结构 {"data": {"layout": {"api":{"pageApi":{//api详情}},"config":{"title":"页面标题"&#xff0c;},"listLayout": {"fields": [{"componentCode": "grid…

力扣经典题:链表合并

解决链表合并问题需要有特定的思路&#xff1a; 、链表合并 王赫辰/c语言 - Gitee.com 简述思路&#xff1a;首先先处理特殊情况&#xff0c;将空指针时的情况进行提前处理 然后再创建新的链表&#xff0c;此时使用尾插比较法&#xff1a; 循环条件&#xff1a;当两个链表中…

Boost 适用 filesystem 库,statx 函数无法找到引用问题的解决方案。

1、boost 高版本使用了 statx 函数&#xff0c;这个函数是在 Linux 内核版本 4.11 之后引入的。 所以&#xff1a;可以升级 Linux 内核版本到4.11之后即可。 2、降低 boost 库版本到 1.70 以下 3、正确的路&#xff0c;改 boost 的编译代码 先看这个&#xff1a; Filesyste…

甲基四嗪-PEG5-炔烃,Methyltetrazine-PEG5-alkyne,可以提高生物分子的稳定性和保存期

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;甲基四嗪五聚乙二醇炔&#xff0c;甲基四嗪-PEG5-炔烃&#xff0c;Methyltetrazine-PEG5-alkyne 一、基本信息 产品简介&#xff1a;Methyltetrazine PEG5 alkyne contains methyltetrazole and PEG5 chains, as we…

pyecharts模块的下载方法以及介绍,折线图的创立

目录 1.pyecharts是什么 2.pyecharts下载方法 1.在屏幕左下角搜索这里输入cmd&#xff0c;找到命令提示符并且打开 2.输入pip install pyecharts 然后回车进行下载 3.检查是否下载完成 4.另一个方法 3.pyecharts入门 4.pyecharts的配置选项 set_global_opts全局配置选…

有关Quick BI中Case子句中多次使用lod函数返回空值问题分析

一、Quick BI中的lod_ include函数 lod_ include {维度1[,维度2]...:聚合表达式[:过滤条件]} 作用&#xff1a;将表达式中的维度一起作为分组依据进行订算。其中&#xff0c; 1) 维度1[,维度2]... &#xff1a;声明维度&#xff0c;指定聚合表达式要连接到的一个或多个维…

聊聊 程序员裁员潮:技术变革下的职业危机

前几天一则新闻爆料&#xff1a;一对来自中国的工程师夫妻在美身亡&#xff0c;疑因谷歌裁员致悲剧发生。看到后深感可惜&#xff0c;鲜活的生命就因为裁员殒落了&#xff1b;同时我也深有感触&#xff0c;有幸经历过裁员&#xff0c;体会过那一段低迷不振的日子。 但是回首当下…

关于达梦认证DCA DCP,TIDB认证PCTA PCTP考试那点事儿

文章最后有彩蛋&#xff0c;一定要看到最后... 一、正确的道路上遇到正确的你 伴随中国数据库领域的快速技术进步&#xff0c;国内数据库生态蓬勃发展&#xff0c;并不断涌现出极具创新力的产品&#xff0c;推动了数据库应用的遍地开花。截至2024年1月&#xff0c;墨天轮数据社…

【sgTree】自定义组件:加载el-tree树节点整棵树数据,实现增删改操作。

特性 可以自定义主键、配置选项支持预定义节点图标&#xff1a;folder文件夹|normal普通样式多个提示文本可以自定义支持动态接口增删改节点可以自定义根节点id可以设置最多允许添加的层级深度支持拖拽排序&#xff0c;排序过程还可以针对拖拽的节点深度进行自定义限制支持隐藏…

C语言——栈的实现

栈---类似于实现制的线性表----只能从一端经行插入和删除 特点 后进先出&#xff08;Last In First Out&#xff0c;LIFO&#xff09;&#xff1a;栈遵循后进先出的原则&#xff0c;即最后一个进入栈的元素将是第一个被移除的元素。单端操作&#xff1a;栈只允许在栈顶进行插…

新建虚拟机并安装配置linux

记得看目录哦&#xff01; 1. 打开VMware2. 新建虚拟机3. 配置虚拟机内存4. 配置处理器5. 配置网络6. 开始安装CentOS系统系统安装包此处自取 7. 启动虚拟机进行安装如果出现这种情况这样转成图形化界面继续安装 1. 打开VMware 点击文件—点击新建虚拟机 2. 新建虚拟机 3. 配置…

JavaScript注释使用

JavaScript注释使用心得 在学习JavaScript的过程中&#xff0c;我渐渐发现了注释的奥妙。它们不仅仅是代码的附属品&#xff0c;更是提升代码可读性和调试效率的神器。 单行注释初探 你知道吗&#xff1f;JavaScript中的单行注释&#xff0c;只需要在代码前面加上//就可以了。…

基于 MQTT 的开源桥接器:自由控制物联网设备 | 开源日报 No.151

Koenkk/zigbee2mqtt Stars: 10.5k License: GPL-3.0 Zigbee2MQTT 是一个 Zigbee &#x1f41d; 到 MQTT 桥接器 &#x1f309;&#xff0c;可以摆脱专有的 Zigbee 桥接器 &#x1f528; 允许您在不使用供应商桥接器或网关的情况下使用 Zigbee 设备通过 MQTT 桥接事件并控制 Z…

多方式登录

后台 插件 >: pip install djangorestframework-jwturls.py path(login/, views.LoginViewSet.as_view({post: login})),dev.py import datetime JWT_AUTH {JWT_EXPIRATION_DELTA: datetime.timedelta(days7), }views.py from rest_framework.viewsets import ViewSet…