Spring的条件注解


spring中的autoconfigure包中定义了大量的条件注解condition,在spring-boot 和spring-cloud中有大量的应用,这些条件注解主要用于控制配置类和bean初始化条件。下面我们就来简单了解下这些条件注解的使用场景。这些条件注解可以放在类上也可以放在方法上

@ConditionalOnBean

判断指定的bean是否存在,如果存在就在执行下面的操作;使用示例:

@Configuration
public class MyConfiguration {
 
    // 只有存在Demo2的bean才会加载下面的这个代码
    @Bean
    @ConditionalOnBean(Demo2.class)
    public Demo1 demo1() {
        return new Demo2();
    }
}

注意如果Demo2的bean创建方式也是在@Configuration中实现那么可能会发生不生效的问题

@ConditionalOnClass

判断当前classpath下是否存在指定类,如果存在就执行下面的操作。比如spring-boot中自动装配对应的组件时(数据库这些)就是通过判断引入的类是否存在才决定是否加载。

@ConditionalOnClass(name = "feign.hystrix.HystrixFeign")
protected static class HystrixFeignTargeterConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public Targeter feignTargeter() {
        return new HystrixTargeter();
    }

}

@ConditionalOnMissingBean

和 @ConditionalOnBean 注解相反,当容器中没有指定的 Bean 才开启配置。

@ConditionalOnMissingClass

和 @ConditionalOnClass 注解相反,当容器中没有指定的 Class 才开启配置。

@ConditionalOnProperty

当指定的属性有指定的值时才开启配置。

...
@ConditionalOnProperty(value = "feign.httpclient.enabled", matchIfMissing = true)
protected static class HttpClientFeignConfiguration {
    ...
}

@ConditionalOnResource

当类路径下有指定的资源才开启配置。

@ConditionalOnSingleCandidate

当指定的 class 在容器中只有一个 Bean,或者同时有多个但为首选时才开启配置。

@ConditionalOnNotWebApplication

当前项目类型是 WEB 项目才开启配置。

@ConditionalOnCloudPlatform

这个注解几乎不使用,它表示只有运行在指定的云平台上才加载指定的 bean。支持的值是一个枚举类 CloudPlatform。

@ConditionalOnExpression

通过SpEL 表达式来决定是否启用。

@ConditionalOnJava

当运行的 Java JVM 在指定的版本范围时才开启配置。


特别提醒:扫码关注微信订阅号'起岸星辰',实时掌握IT业界技术资讯! 转载请保留原文中的链接!
  目录