@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();
}
}