Spring Boot条件注解之@ConditionalOnProperty完全解析

 更新时间:2025年02月13日 10:53:03   作者:CodeDunkster  
这篇文章主要介绍了SpringBoot中的@ConditionalOnProperty注解,通过配置文件属性值控制Bean或配置类的加载,实现功能开关和环境配置,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

在 Spring Boot 项目中,有时候我们希望根据配置文件中的某个属性值来决定是否启用某个功能或加载某个组件。此时,@ConditionalOnProperty 注解就可以发挥作用。它通过配置文件的属性值控制 Bean 或配置类的加载,使得我们的程序更具灵活性。

本文将详细介绍 @ConditionalOnProperty 的用法,并通过 功能开关 和 环境配置 两个实际场景来展示它的强大之处。

1. @ConditionalOnProperty 基本用法

语法

@ConditionalOnProperty(
    prefix = "前缀",
    name = "属性名",
    havingValue = "指定值",
    matchIfMissing = false
)

参数说明:

  • prefix:属性的前缀部分。
  • name:属性名称。
  • havingValue:属性的值与 havingValue 相等时条件成立(默认不指定)。
  • matchIfMissing:如果属性未定义,是否加载配置(默认 false,即未定义时不加载)。

2. 实战场景

场景一:功能开关

在实际项目中,我们可能需要通过配置文件中的某个属性来控制某个功能的启用或禁用。比如,是否开启定时任务、是否启用某个服务等。

示例:通过功能开关启用日志增强功能

Step 1:配置文件定义开关

在 application.properties 文件中添加一个开关属性:

feature.logging-enhancement.enabled=true

Step 2:实现日志增强功能

使用 @ConditionalOnProperty 来决定是否加载日志增强的 Bean:

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConditionalOnProperty(prefix = "feature.logging-enhancement", name = "enabled", havingValue = "true", matchIfMissing = false)
public class LoggingEnhancementConfig {

    @Bean
    public String loggingEnhancement() {
        System.out.println("日志增强功能已启用!");
        return "Logging Enhancement Activated";
    }
}

Step 3:测试

  • 当 feature.logging-enhancement.enabled=true 时,LoggingEnhancementConfig 类会被加载,控制台会输出:
    日志增强功能已启用!
    
  • 当 feature.logging-enhancement.enabled=false 或未配置时,LoggingEnhancementConfig 类不会被加载。

场景二:环境配置

在不同的环境(开发、测试、生产)中,我们可能需要加载不同的配置。例如,开发环境下使用内存数据库,生产环境下使用 MySQL 数据库。

示例:不同环境下选择数据源

Step 1:配置文件

在 application.properties 中配置环境标识:

# 开发环境
spring.datasource.env=dev

# 生产环境
# spring.datasource.env=prod

Step 2:开发环境数据源配置

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

@Configuration
@ConditionalOnProperty(prefix = "spring.datasource", name = "env", havingValue = "dev")
public class DevDataSourceConfig {

    @Bean
    public DataSource devDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("org.h2.Driver");
        dataSource.setUrl("jdbc:h2:mem:testdb");
        dataSource.setUsername("sa");
        dataSource.setPassword("");
        System.out.println("开发环境:加载内存数据库");
        return dataSource;
    }
}

Step 3:生产环境数据源配置

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

@Configuration
@ConditionalOnProperty(prefix = "spring.datasource", name = "env", havingValue = "prod")
public class ProdDataSourceConfig {

    @Bean
    public DataSource prodDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/proddb");
        dataSource.setUsername("root");
        dataSource.setPassword("password");
        System.out.println("生产环境:加载 MySQL 数据库");
        return dataSource;
    }
}

Step 4:测试

  • 开发环境spring.datasource.env=dev控制台输出:

    开发环境:加载内存数据库
    
  • 生产环境spring.datasource.env=prod控制台输出:

    生产环境:加载 MySQL 数据库
    

3. 常见应用场景总结

  • 功能开关:动态启用或禁用某个功能模块(如定时任务、监控服务等)。
  • 环境配置:根据不同环境加载不同的配置(如数据源、日志级别等)。
  • 组件选择:根据配置加载特定的第三方组件(如不同的缓存实现 Redis/ehcache)。
  • 服务切换:实现备用服务或降级服务的自动切换。

4. 小结

@ConditionalOnProperty 是 Spring Boot 中非常实用的条件注解,可以通过配置文件灵活地控制 Bean 和配置类的加载,避免不必要的资源浪费,并提高系统的可维护性。

通过功能开关和环境配置的示例,我们可以看到 @ConditionalOnProperty 如何让代码更清晰、配置更灵活,极大地满足了开发者在不同场景下的需求。

最佳实践

  • 配置文件中使用统一的前缀管理属性,避免冲突。
  • 开关属性的命名要清晰直观,比如 feature.xxx.enabled
  • 对于重要的功能开关,可以结合文档明确其作用和默认值。

希望这篇博客能帮助你更好地掌握 @ConditionalOnProperty 的用法,让你的 Spring Boot 项目更加灵活和可配置!

总结

到此这篇关于Spring Boot条件注解之@ConditionalOnProperty完全解析的文章就介绍到这了,更多相关SpringBoot条件注解@ConditionalOnProperty内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java将数组转换成字符串的四种方法总结

    Java将数组转换成字符串的四种方法总结

    这篇文章主要给大家介绍了关于Java将数组转换成字符串的四种方法,每种方法都有其适用的场景和优缺点,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-12-12
  • 深入了解Java设计模式之UML类图

    深入了解Java设计模式之UML类图

    UML 即 Unified Modeling Language 统一建模语言,是用来设计软件的可视化建模语言。本文就带大家了解一下UML中类图的定义与使用,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-11-11
  • Java如何获取Cookie和Session

    Java如何获取Cookie和Session

    Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId是 Cookie 和 Session 之间的桥梁,这篇文章主要介绍了Java获取Cookie和Session的方法,需要的朋友可以参考下
    2024-01-01
  • SpringBoot使用GTS的示例详解

    SpringBoot使用GTS的示例详解

    这篇文章主要介绍了SpringBoot使用GTS的示例详解,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • Java实现爬虫给App提供数据(Jsoup 网络爬虫)

    Java实现爬虫给App提供数据(Jsoup 网络爬虫)

    这篇文章主要介绍了Java实现爬虫给App提供数据,即Jsoup 网络爬虫,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • 9个java数组常用操作实例

    9个java数组常用操作实例

    在本篇文章里小编给各位整理了关于java数组常用操作的实例以及相关的代码,需要的朋友们跟着学习下。
    2019-07-07
  • Intellij IDEA远程debug教程实战和要点总结(推荐)

    Intellij IDEA远程debug教程实战和要点总结(推荐)

    这篇文章主要介绍了Intellij IDEA远程debug教程实战和要点总结(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Java设计模块系列之书店管理系统单机版(一)

    Java设计模块系列之书店管理系统单机版(一)

    这篇文章主要为大家详细介绍了Java单机版的书店管理系统设计模块和思想第一章,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • java基于反射得到对象属性值的方法

    java基于反射得到对象属性值的方法

    这篇文章主要介绍了java基于反射得到对象属性值的方法,结合实例形式分析了java基于反射获取对象属性值的相关实现方法与操作技巧,需要的朋友可以参考下
    2017-03-03
  • Java构建乘积数组的方法

    Java构建乘积数组的方法

    这篇文章主要为大家详细介绍了Java构建乘积数组的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03

最新评论