最近在研究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,當前配置類不生效,不生效就什么都不做,不會往容器中添加組件。