SpringBoot内置条件注解
SpringBoot 内置的成品条件注解
SpringBoo中常用的内置的注解主要以下:
1. @ConditionalOnProperty() 指定的属性是否有指定的值
2. @ConditionalOnBean() 当SpringIoC容器内存在指定Bean的条件
3. @ConditionalOnClass
4. @ConditionalOnExpression 基于SpEL表达式作为判断条件
5. @ConditionalOnjava 基于JVM版本作为判断条件
6. @ConditionalOnJndi 在JNDI存在时查找指定的位置
7. @ConditionalOnMissingBean 当SpringIoC容器内不存在指定Bean的条件
8. @ConditionalOnMissingClass 当SpringIoC容器内不存在指定Class的条件
9. @ConditionalOnNotWebApplication 当前项目不是Web项目的条件
10. @ConditionalOnResource 类路径是否有指定的值
11. @ConditionalOnSingleCandidate 当指定Bean在SpringIoc容器内只有一个,或者虽然有多个但是指定首选的Bean
12. @ConditionalOnWebApplication 当前项目是Web项目的条件
下面举两个示例
@ConditionalOnProperty()
该注解有三个参数,分别是: value, havingValue, matchIfMissing,其中value是元类,havingValue是值,matchIfMissing用来处理如果没有找到对应Bean的情况下,默认使用的Bean,该参数的缺省值是false.
举个例子:目前我们有三个类,分别是:Hero,Hero1,Hero2,在配置文件中配置hero.conditional的值,当配置文件中的设置的为hero1的时候,则返回一个Hero1的实例对象;为hero2的时候,则返回一个Hero2的实例对象,如果都匹配不上的话,则返回一个Hero对象。
- application.properties
hero.conditional=ethan
- HeroConfiguration
@Configuration
public class HeroConfiguration {
@Bean
@ConditionalOnProperty(value = "Hero1.class", havingValue = "hero1")
public ISkill hero1() {
return new Hero1();
}
@Bean
@ConditionalOnProperty(value = "Hero2.class", havingValue = "hero2")
public ISkill hero2() {
return new Hero2();
}
@Bean
@ConditionalOnProperty(value = "Hero.class", matchIfMissing = true)
public ISkill hero() {
return new Hero();
}
}
@ConditionalOnBean()
有一个MySQL类,是通过配置类DatabaseConfiguration注入到容器中,可以在@Bean中添加一个条件注解,只有当MySQL这个类存在的时候才能注入到容器中,否则不能注入。
- DatabaseConfiguration
@Configuration
public class DatabaseConfiguration {
@Value("${mysql.ip}")
private String ip;
@Value("${mysql.port}")
private String port;
@Bean
public IConnect mysql() {
return new MySQL(ip, port);
}
}
当容器有 mysql这个bean的时候,HeroConfiguration才会将hero1加载到容器中
@Configuration
public class HeroConfiguration {
@Bean
@ConditionalOnBean(name = "mysql")
public ISkill hero1() {
return new Hero1("gabriel", 18);
}
}
如果将DatabaseConfiguration中的@Bean去除掉,则启动就会报错
浙公网安备 33010602011771号