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项目的条件
下面举两个示例
该注解有三个参数,分别是: value, havingValue, matchIfMissing
,其中value
是元类,havingValue
是值,matchIfMissing
用来处理如果没有找到对应Bean
的情况下,默认使用的Bean
,该参数的缺省值是false
.
举个例子:目前我们有三个类,分别是:Hero
,Hero1
,Hero2
,在配置文件中配置hero.conditional
的值,当配置文件中的设置的为hero1
的时候,则返回一个Hero1
的实例对象;为hero2
的时候,则返回一个Hero2
的实例对象,如果都匹配不上的话,则返回一个Hero
对象。
hero.conditional=ethan
@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();
}
}
有一个MySQL
类,是通过配置类DatabaseConfiguration
注入到容器中,可以在@Bean中添加一个条件注解,只有当MySQL
这个类存在的时候才能注入到容器中,否则不能注入。
@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
去除掉,则启动就会报错
原文:https://www.cnblogs.com/xlucky/p/14610058.html