SpringBoot-条件注解解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 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时,输出如下
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Goodbye_Youth/article/details/84574640
今日推荐