尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

@ConditionalOnProperty 注解功能和使用场景说明完整示例演示

@ConditionalOnProperty 注解功能和使用场景说明完整示例演示
📅 发布时间:2026/6/30 4:47:08

在 Spring Boot 开发中,@ConditionalOnProperty是一个非常强大且常用的条件注解。它允许开发者根据配置文件(如application.properties或application.yml)中的属性值,来动态决定是否加载某个配置类或注册某个 Bean。这种机制极大地提升了应用程序的灵活性,常用于实现功能开关(Feature Toggle)和环境隔离。

核心参数说明

该注解的核心判断逻辑依赖于以下几个关键属性:

  • name / value:(必需) 指定要检查的属性名称。支持字符串数组,表示需要同时检查多个属性。
  • prefix:(可选) 属性名的前缀。如果设置了前缀,name属性将自动拼接在此前缀之后。
  • havingValue:(可选) 指定期望的属性值。只有当配置的实际值与havingValue相等时,条件才满足。如果不设置该值,则默认只要属性存在且不为false即匹配。
  • matchIfMissing:(可选) 布尔值,默认为false。表示当指定的属性在配置文件中不存在时,是否认为条件满足。

完整示例演示

下面通过一个“环境数据源切换”的实战场景,演示如何使用该注解。

1. 配置文件定义

假设我们在application.properties中配置当前运行的环境标识:

# 开发环境 spring.datasource.env=dev # 生产环境(切换时取消注释即可) # spring.datasource.env=prod
2. 开发环境数据源配置

通过@ConditionalOnProperty限制该配置类仅在env=dev时生效:

importorg.springframework.boot.autoconfigure.condition.ConditionalOnProperty;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importjavax.sql.DataSource;importorg.springframework.jdbc.datasource.DriverManagerDataSource;@Configuration@ConditionalOnProperty(prefix="spring.datasource",name="env",havingValue="dev")publicclassDevDataSourceConfig{@BeanpublicDataSourcedevDataSource(){DriverManagerDataSourcedataSource=newDriverManagerDataSource();dataSource.setDriverClassName("org.h2.Driver");dataSource.setUrl("jdbc:h2:mem:testdb");dataSource.setUsername("sa");dataSource.setPassword("");System.out.println("开发环境:成功加载内存数据库");returndataSource;}}
3. 生产环境数据源配置

同理,限制该配置类仅在env=prod时生效:

importorg.springframework.boot.autoconfigure.condition.ConditionalOnProperty;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importjavax.sql.DataSource;importorg.springframework.jdbc.datasource.DriverManagerDataSource;@Configuration@ConditionalOnProperty(prefix="spring.datasource",name="env",havingValue="prod")publicclassProdDataSourceConfig{@BeanpublicDataSourceprodDataSource(){DriverManagerDataSourcedataSource=newDriverManagerDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3306/proddb");dataSource.setUsername("root");dataSource.setPassword("password");System.out.println("生产环境:成功加载 MySQL 数据库");returndataSource;}}
4. 运行效果
  • 当配置文件中为spring.datasource.env=dev时,控制台将输出:开发环境:成功加载内存数据库。
  • 当配置文件中为spring.datasource.env=prod时,控制台将输出:生产环境:成功加载 MySQL 数据库。

常见使用场景总结

除了上述的环境隔离,@ConditionalOnProperty还广泛应用于以下场景:

  1. 功能开关:动态启用或禁用某个功能模块(如日志增强、定时任务、监控服务等),无需修改代码即可通过配置控制。
  2. 组件选择:根据配置加载特定的第三方组件实现(例如在 Redis 和 Ehcache 之间切换缓存实现)。
  3. 服务切换与降级:实现备用服务或降级服务的自动切换,提高系统的容错能力。
  4. 可选服务加载:在微服务架构中,某些服务可能是可选的,只有在设置了特定属性时才处于激活状态。

⚠️ 注意事项

  • 该注解不能可靠地用于匹配集合属性(例如spring.example.values),对于集合类型的条件判断,建议使用自定义条件(Custom Condition)。
  • 合理配置属性名称并做好文档记录,避免过度使用matchIfMissing=true导致配置逻辑难以追踪。

相关新闻

  • BLE Link Layer【Bit Ordering】:为什么 b0 b1 b2 = 110 表示 3,而不是 6?
  • 当AI编程工具开始“挑网络”:Anthropic封禁第三方调用背后,开发者的网络出口为何成为关键变量
  • 构建自主可控的Web安全防线:ModSecurity与OWASP CRS集成实战指南

最新新闻

  • League Akari自动秒选功能终极指南:10个高效配置技巧全解析
  • 如何让ChatGPT写出被导师夸“逻辑严密、术语精准”的论文段落?——12个经SCI期刊编辑实测有效的Prompt结构
  • 基于TRF7960A的16通道HF RFID多路复用系统设计与实战
  • 手工排班暗藏用工合规风险,连锁企业如何规避赔偿与人力损耗
  • 2026深度实测|Cursor优质替代品全景对比,中文Vibe Coding开发者必看
  • 哇塞!原来论文可以这样省时间?2026降AI率平台推荐合集

日新闻

  • 【计算机毕业设计案例】基于 Spring Boot+Vue 的电影售票系统设计与实现 前后端分离架构下影院在线购票管理平台(程序+文档+讲解+定制)
  • 到底 TMD 用哪个: npm, pnpm, Yarn, Bun, Deno? 傻瓜, 当然用 npm 啦
  • Google限制Meta使用Gemini模型 凸显AI授权竞争白热化

周新闻

  • Windows字体自定义终极方案:No!! MeiryoUI完全指南
  • Deepin Boot Maker:告别命令行,3分钟制作Linux启动盘的智能解决方案
  • Plain Craft Launcher 2:重新定义你的Minecraft游戏体验

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号