版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Goodbye_Youth/article/details/84574640
当我们开发SpringBoot项目时,有时候我们会根据不同的条件来创建相对应的Bean对象,这个时候就用到了SpringBoot自带的条件注解,这里我基于的SpringBoot版本是 1.5.4.RELEASE
- 首先我们来看看SpringBoot一共提供了哪些条件注解
- @ConditionalOnBean:当配置了某个特定的Bean对象时生效
- @ConditionalOnMissingBean:当没有配置某个特定的Bean对象时生效
- @ConditionalOnClass:当Classpath里存在指定的class文件时生效
- @ConditionalOnBean:当Classpath里不存在指定的class文件时生效
- @ConditionalOnWebApplication:当项目是一个web应用程序时生效
- @ConditionalOnNotWebApplication:当项目不是一个web应用程序时生效
- @ConditionalOnResource:当Classpath里存在指定的资源时生效
- @ConditionalOnProperty:当指定的配置属性有一个明确的值时生效
- @ConditionalOnJava:当Java版本匹配一个特定值或着一个范围值时生效
- @ConditionalOnExpression:当配置文件中的表达式为true时生效
- 以上所有的条件注解中,都使用了 @Conditional 这个最基础的条件注解
- 以下是使用@Conditional条件注解的一个例子
1、首先我们先定义一个Controller及其Service接口
CirculationController
@RestController
public class CirculationController {
@Resource(name = "circulationService")
private ICirculationService circulationService;
@GetMapping(value = "/test")
public void test() {
circulationService.circulate();
}
}
ICirculationService
public interface ICirculationService {
void circulate();
}
2、再定义两个实现类分别实现该Service接口
ForCirculationImpl
public class ForCirculationImpl implements ICirculationService {
@Override
public void circulate() {
System.out.print("For Circulation!!!");
}
}
ForeachCirculationImpl
public class ForeachCirculationImpl implements ICirculationService {
@Override
public void circulate() {
System.out.print("Foreach Circulation!!!");
}
}
3、第1步中,注入了一个名为circulationService的Bean对象,这里注册该Bean对象
- 使用@Configuration + @Bean两个注解来注册Bean对象
- 使用@Conditional注解,根据其参数对象来决定是否注册该Bean对象
CirculationConfig
@Configuration
public class CirculationConfig {
@Bean(name = "circulationService")
@Conditional(ForeachCondition.class)
public ICirculationService getForeachCirculation() {
return new ForeachCirculationImpl();
}
@Bean(name = "circulationService")
@Conditional(ForCondition.class)
public ICirculationService getForCirculation() {
return new ForCirculationImpl();
}
}
4、定义@Conditional注解所需的参数类,需要实现Condition接口或继承Condition接口实现类
- 当java版本为1.7时,ForCondition的matches方法会返回true,会注册Bean对象
- 当java版本为1.8时,ForeachCondition的matches方法会返回true,会注册Bean对象
ForCondition
public class ForCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
return conditionContext.getEnvironment().getProperty("java.version").contains("1.7");
}
}
ForeachCondition
public class ForeachCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
return conditionContext.getEnvironment().getProperty("java.version").contains("1.8");
}
}
5、启动项目,在浏览器中输入 http://localhost:8080/test 进行测试
- 当java版本为1.7时,输出如下
- 当java版本为1.8时,输出如下