@ConditionalOnProperty与@ConditionalOnClass

106 阅读2分钟

@ConditionalOnProperty的目的

通常,在开发基于Spring的应用程序时,可能需要根据配置属性的存在和值有条件地创建一些bean。

例如,取决于是否将属性值设置为“prod”或“test”,可能想要注册一个DataSource bean来指向生产或测试数据库。

幸运的是,实现这一目标并不像想象的那样困难。 Spring框架正是为此目的提供了@ConditionalOnProperty注解。

简而言之,@ConditionalOnProperty仅在存在环境属性且具有特定值的情况下才启用Bean注册。 默认情况下,必须定义指定的属性,并且不等于false。

现在已经熟悉了@ConditionalOnProperty注解的用途,接下来深入地了解它的工作原理。

新增yml配置

second:
  datasource: mysql
@Configuration
@ConditionalOnProperty(prefix="", name="second.datasource", havingValue = "mysql")
public class SecondDatasourceConfig {

    @Bean
    public A beanA(){
        System.out.println("A beanA");
        return new A();
    }
}
@Configuration
@ConditionalOnProperty(prefix="second", name="datasource", havingValue = "mysql")
public class SecondDatasourceConfig {

    @Bean
    public A beanA(){
        System.out.println("A beanA");
        return new A();
    }
}

prefix="", name="second.datasource" 与 prefix="second", name="datasource"效果一致

ConditionalOnClass

@Conditional(TestCondition.class) 就是说只有在classpath下能找到这个类才会构建这个bean

这句代码可以标注在类上面,表示该类下面的所有@Bean都会启用配置,也可以标注在方法上面,只是对该方法启用配置。

@ConditionalOnBean(仅仅在当前上下文中存在某个对象时,才会实例化一个Bean)
@ConditionalOnClass(某个class位于类路径上,才会实例化一个Bean)
@ConditionalOnExpression(当表达式为true的时候,才会实例化一个Bean)
@ConditionalOnMissingBean(仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean)
@ConditionalOnMissingClass(某个class类路径上不存在的时候,才会实例化一个Bean)
@ConditionalOnNotWebApplication(不是web应用)
@Configuration
public class ConditionOnClassConfig {

    @Bean
    @ConditionalOnClass(value = {java.util.HashMap.class, java.util.Arrays.class})
    public A beanA(){
        System.out.println("A beanA");
        return new A();
    }

    @Bean
    @ConditionalOnClass(name = {"com.sample.Dummy", "java.util.HashMap"})
    public B beanB(){
        System.out.println("B beanB");
        return new B();
    }
}