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