欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ConditionalOnProperty注解的作用和使用方式

 更新時間:2024年09月26日 08:45:55   作者:碼農娟  
在SpringBoot項目開發(fā)中,@ConditionalOnProperty注解允許根據配置文件中的屬性值來控制配置類是否生效,該注解通過屬性name和havingValue來判斷配置是否注入,如果application.properties中的對應屬性值為空或不匹配havingValue設定值

ConditionalOnProperty注解的作用

在開發(fā)spring boot框架的項目時,需要控制配置類是否生效,這個時候就要用到@ConditionalOnProperty注解;

@ConditionalOnProperty注解可以通過配置文件中的屬性值,來判定configuration是否被注入;

源碼

ConditionalOnProperty的源碼

package org.springframework.boot.autoconfigure.condition;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.context.annotation.Conditional;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Conditional({OnPropertyCondition.class})
public @interface ConditionalOnProperty {
    String[] value() default {};

    String prefix() default "";

    String[] name() default {};

    String havingValue() default "";

    boolean matchIfMissing() default false;
}

屬性說明

  • value: 獲取對應property名稱的值,與name不可同時使用
  • prefix: 配置項的前綴,可有可無
  • name: property完整名稱或部分名稱(可與prefix組合使用,組成完整的property名稱),與value不可同時使用  
  • havingValue: 可與name組合使用,比較獲取到的屬性值與havingValue給定的值是否相同,當兩個值相同返回true相同才加載配置
  • matchIfMissing: 如果配置文件中, 沒有該配置項, 判斷是否加載BEAN, 默認為false。  

用法

通過其兩個屬性name以及havingValue來實現(xiàn)的,其中name用來從application.properties中讀取某個屬性值。

如果該值為空,則返回false; 如果值不為空,則將該值與havingValue指定的值進行比較,

如果一樣則返回true;否則返回false。 如果返回值為false,則該configuration不生效;為true則生效。

示例

以數(shù)據源配置為例:

配置文件信息:

spring:
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        druid:
            # 主庫數(shù)據源
            master:
                url: jdbc:mysql://127.0.0.1/test1?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                username: root
                password: 123456
            # 從庫數(shù)據源
            slave:
                # 從數(shù)據源開關/默認關閉
                enabled: true
                url: jdbc:mysql://127.0.0.1:3306/test2?useUnicode=true&characterEncoding=utf-8&useSSL=false
                username: root
                password: 123456

注解使用:

@Configuration
public class DynamicDataSourceConfig
{
    @Bean
    @ConfigurationProperties("spring.datasource.druid.master")
    public DataSource masterDataSource(DruidProperties druidProperties)
    {
       
    }

    @Bean
    @ConfigurationProperties("spring.datasource.druid.slave")
    @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true")
    public DataSource slaveDataSource(DruidProperties druidProperties)
    {
       
    }
    .
    .
    .
}
  • 指定了prefix,name,havingValue,因配置項為true,所以會加載slave庫。

拓展

Spring Boot@Conditional 注解為我們做了細化,類似的注解共有14個,這些注解都定義在 org.springframework.boot.autoconfigure.condition包下。

以上圈起來的注解:

  • 都可以應用在 TYPE 上;(可以理解為:Spring 自動掃描的一切類 (@Configuration, @Component, @Service, @Repository, @Controller) 都可以通過添加相應的 @ConditionalOnXxxx 來判斷是否加載;)
  • 都可以應用在 METHOD 上,所以有 @Bean 標記的方法也可以應用這些注解;
  • 都使用了 @Conditional 注解來標記,OnBeanCondition 等自定義 Condition 也是實現(xiàn)了 Condition 接口

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

最新評論