关于@ConditionalOnProperty的使用

本文介绍如何在SpringBoot项目中使用@ConditionalOnProperty控制Swagger2的开关,实现仅在本地开发环境下启用Swagger UI,而在测试和正式环境中禁用的功能。

 问题描述

            项目整合了Swagger2,想弄一个开关,在本地开发阶段:

            可以通过  http://localhost:8080swagger-ui.html 调试接口;测试,正式环境不可访问;

解决方案

           使用spring boot 的:@ConditionalOnProperty标签可以控制被@Configuration注释的配置类 是否生效 

具体代码:         

@Configuration
@ConditionalOnProperty(prefix = "swagger", value = {"enable"}, havingValue = "true")
@EnableSwagger2
public class SwaggerConfig {} 
  • 以下代码为ConditionalOnProperty注解的属性说明:
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ ElementType.TYPE, ElementType.METHOD })
    @Documented
    @Conditional(OnPropertyCondition.class)
    public @interface ConditionalOnProperty {
       //在application.properties中自定义属性的名称:例如enable
       String[] value() default {};
    
       //在application.properties中自定义属性的前缀:例如swagger; 可以拼接value和name配置的值
       String prefix() default "";
     
       //在application.properties中自定义属性的全称:例如swagger.enable或者enable
       String[] name() default {};
      
       //用来在application.properties中自定义属性的值进行比较,若想同:则Configuration配置类生效,反之不生效;
       String havingValue() default "";
      
       boolean matchIfMissing() default false;
      
       boolean relaxedNames() default true;
    
    }
    
  • application.properties中添加对应配置:
    #swagger开关: true 打开,false 关闭
    swagger.enable = true
  • 三种配置效果想同:
  • @ConditionalOnProperty(prefix = "swagger",name = {"enable"},havingValue = "true")
  • @ConditionalOnProperty(name = {"swagger.enable"},havingValue = "true")
  • @ConditionalOnProperty(prefix = "swagger",value = {"enable"},havingValue = "true")

 

知识笔记!有不对的地方,欢迎指正!

 

 

### @ConditionalOnProperty 注解的使用指南示例 #### 1. 注解的基本用途 `@ConditionalOnProperty` 是 Spring Boot 提供的一个条件注解,用于根据配置文件中的属性值决定是否创建某个 Bean 或启用某个配置类。它的核心作用是通过属性值控制组件的加载行为,从而实现灵活的配置管理。例如,可以通过配置文件中的开关来启用或禁用某些功能模块[^3]。 #### 2. 注解的语法结构 `@ConditionalOnProperty` 的基本语法如下: ```java @ConditionalOnProperty( prefix = "前缀", name = "属性名", havingValue = "指定值", matchIfMissing = false ) ``` - `prefix`:指定属性的前缀。 - `name`:指定属性的名称。 - `havingValue`:指定属性需要匹配的值。如果属性值与 `havingValue` 相等,则条件成立。 - `matchIfMissing`:当属性不存在时的默认行为。如果设置为 `true`,则在属性缺失时条件成立;如果设置为 `false`,则在属性缺失时条件不成立。 #### 3. 控制 Bean 的创建 `@ConditionalOnProperty` 可以直接用于 `@Bean` 注解的方法上,用于控制某个 Bean 的创建。例如,以下代码展示了如何根据配置文件中的 `notification.service` 属性值决定是否创建 `notificationSender` Bean: ```java @Bean(name = "emailNotification") @ConditionalOnProperty(prefix = "notification", name = "service") public NotificationSender notificationSender() { return new EmailNotification(); } ``` 在这个示例中,只有当配置文件中存在 `notification.service` 属性时,才会创建 `notificationSender` Bean[^4]。 #### 4. 控制配置类的生效 `@ConditionalOnProperty` 还可以用于 `@Configuration` 注解的类上,以控制整个配置类是否生效。例如,以下代码展示了如何根据配置文件中的 `feature.enabled` 属性值决定是否启用某个配置类: ```java @Configuration @ConditionalOnProperty(prefix = "feature", name = "enabled", havingValue = "true") public class FeatureConfiguration { // 配置内容 } ``` 在这个示例中,只有当配置文件中 `feature.enabled` 的值为 `true` 时,`FeatureConfiguration` 类才会生效[^2]。 #### 5. 实际应用场景 `@ConditionalOnProperty` 的典型应用场景包括: - **功能开关**:通过配置文件控制某些功能模块的启用或禁用。例如,可以根据环境配置启用或禁用调试日志。 - **环境配置**:根据不同的环境(如开发、测试、生产)加载不同的配置。例如,可以为开发环境加载内存数据库配置,为生产环境加载实际的数据库连接配置。 - **按需加载**:根据业务需求动态加载某些组件。例如,只有在启用某个功能时才加载相关的服务类。 ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值