在 Spring Boot 项目中,有时候我们希望根据配置文件中的某个属性值来决定是否启用某个功能或加载某个组件。此时,@ConditionalOnProperty
注解就可以发挥作用。它通过配置文件的属性值控制 Bean 或配置类的加载,使得我们的程序更具灵活性。
本文将详细介绍 @ConditionalOnProperty
的用法,并通过 功能开关 和 环境配置 两个实际场景来展示它的强大之处。
@ConditionalOnProperty(
prefix = "前缀",
name = "属性名",
havingValue = "指定值",
matchIfMissing = false
)
参数说明:
havingValue
相等时条件成立(默认不指定)。false
,即未定义时不加载)。在实际项目中,我们可能需要通过配置文件中的某个属性来控制某个功能的启用或禁用。比如,是否开启定时任务、是否启用某个服务等。
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 数据库
@ConditionalOnProperty
是 Spring Boot 中非常实用的条件注解,可以通过配置文件灵活地控制 Bean 和配置类的加载,避免不必要的资源浪费,并提高系统的可维护性。
通过功能开关和环境配置的示例,我们可以看到 @ConditionalOnProperty
如何让代码更清晰、配置更灵活,极大地满足了开发者在不同场景下的需求。
feature.xxx.enabled
。希望这篇博客能帮助你更好地掌握 @ConditionalOnProperty
的用法,让你的 Spring Boot 项目更加灵活和可配置! ??