springboot注解之@ConditionalOnProperty


  最近在研究springboot的源碼,看到很多@ConditionalOnXxx的注解,大概明白此注解的意思,就是判斷條件,這個條件就是Xxx,例如ConditionalOnProperty就是判斷配置文件中有沒有這個Property,如果有這個Property則此注解標注的類中的所有帶有@Bean注解的方法就會生效,於是就會往容器中添加組件。

  雖然明白了大致意思,但是對這鍾注解中的屬性不是很了解,於是開始在網上找資料,最終終於弄明白了。下邊將以ConditionalOnProperty注解為例來記錄自己所了解到的內容。

下邊這段代碼是springboot中DataSourceConfiguration類中的一段自動配置代碼。其主要意思是springboot自動幫我們配置HikariDataSource數據源

@Configuration(
        proxyBeanMethods = false
    )
    @ConditionalOnClass({HikariDataSource.class})
    @ConditionalOnMissingBean({DataSource.class})
 @ConditionalOnProperty( name = {"spring.datasource.type"}, havingValue = "com.zaxxer.hikari.HikariDataSource", matchIfMissing = true )
    static class Hikari {
        Hikari() {
        }

        @Bean
        @ConfigurationProperties(
            prefix = "spring.datasource.hikari"
        )
        HikariDataSource dataSource(DataSourceProperties properties) {
            HikariDataSource dataSource = (HikariDataSource)DataSourceConfiguration.createDataSource(properties, HikariDataSource.class);
            if (StringUtils.hasText(properties.getName())) {
                dataSource.setPoolName(properties.getName());
            }

            return dataSource;
        }
    }

 

這段源碼中,就存在ConditionalOnProperty注解,其中有三個屬性name、havingValue、matchIfMissing

  name:這個屬性是指從application.properties/yml配置文件中讀取的屬性名稱

  havingValue:將name屬性綁定的從配置讀取的屬性值跟havingValue綁定的值進行比較,如果一樣則返回true;否則返回false。返回true,則當前配置類生效,返回flase則當前配置類不生效。

  matchIfMissing:這個屬性我查了好多博客,很多都說的很含糊。這個屬性如果設置為true就代表:如果在配置文件中找不到name指定的屬性(即沒有配置name所指定的屬性,在這里就是上邊代碼的spring.datasource.type),則直接返回true,當前配置類生效。

 

總而言之,上邊springboot源碼中的ConditionalOnProperty注解:

    @ConditionalOnProperty( name = {"spring.datasource.type"}, havingValue = "com.zaxxer.hikari.HikariDataSource", matchIfMissing = true )

ConditionalOnProperty注解會先判斷配置文件中有沒有spring.datasource.type這個屬性,如果沒有,則當前配置類直接生效,@Bean注解就會往ioc容器中添加HikariDataSource類型的數據源。如果配置文件中有配置spring.datasource.type這個屬性,則將spring.datasource.type對應的值與"com.zaxxer.hikari.HikariDataSource"進行比較,比較結果一致,則當前配置類生效,@Bean注解往ioc容器中添加HikariDataSource類型的數據源。比較結果不一致,則返回flase,當前配置類不生效,不生效就什么都不做,不會往容器中添加組件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM