springboot中的@Conditional注解

springboot中使用@Configuration注解完成一个配置类的配置,被该注解标注的类会在程序启动时自动的加载到IOC容器,但如果我们想通过一些条件来控制被@Configuraion注解标注的配置类的生效与否,可以使用springboot提供的@Conditional注解来对条件进行控制,通过该注解指定哪些条件下才能自动加载配置,如果不满足条件,则不加载。以下是常见的@Conditional注解的类型:

1、@ConditionalOnClass

条件是:类路径下,如果存在指定的类,则该配置类生效。类路径即classpath,也就是src路径和pom引入的依赖External Library路径下

@ConditionalOnClass({EnableWebSecurity.class})

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional({OnClassCondition.class})
public @interface ConditionalOnClass {
    Class<?>[] value() default {};

    String[] name() default {};
}

2、@ConditionalOnMissingClass

条件是:类路径下,如果不存在指定的类,则该配置类生效

@ConditionalOnMissingClass("org.springframework.cloud.gateway.config.GatewayAutoConfiguration")

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional({OnClassCondition.class})
public @interface ConditionalOnMissingClass {
    String[] value() default {};
}

3、@ConditionalOnBean

条件是:如果当前应用IOC容器存在指定的Bean,则该配置类生效。

@ConditionalOnBean(ResourceServerConfiguration.class)

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional({OnBeanCondition.class})
public @interface ConditionalOnBean {
    Class<?>[] value() default {};

    String[] type() default {};

    Class<? extends Annotation>[] annotation() default {};

    String[] name() default {};

    SearchStrategy search() default SearchStrategy.ALL;

    Class<?>[] parameterizedContainer() default {};
}

4、@ConditionalOnMissingBean

条件是:如果当前应用IOC容器不存在指定的Bean,则该配置类生效。

@ConditionalOnMissingBean(
    name = {"springSecurityFilterChain"}
)

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional({OnBeanCondition.class})
public @interface ConditionalOnMissingBean {
    Class<?>[] value() default {};

    String[] type() default {};

    Class<?>[] ignored() default {};

    String[] ignoredType() default {};

    Class<? extends Annotation>[] annotation() default {};

    String[] name() default {};

    SearchStrategy search() default SearchStrategy.ALL;

    Class<?>[] parameterizedContainer() default {};
}

5、@ConditionalOnProperty

条件是:如果当前应用的配置文件中存在指定的属性配置,则该配置类生效。

  @ConditionalOnProperty(
      prefix = "spring.aop",
      name = {"proxy-target-class"},
      havingValue = "true",
      matchIfMissing = true
  )      

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Conditional({OnPropertyCondition.class})
public @interface ConditionalOnProperty {
    String[] value() default {};

    String prefix() default "";        // 匹配属性前缀

    String[] name() default {};         // 匹配属性配置名字

    String havingValue() default "";    // 指定的配置属性匹配该值时生效

    boolean matchIfMissing() default false;    // 如果该属性配置不存在是否生效,false不生效,true生效
}

6、@ConditionalOnWebApplication

条件是:如果当前应用是web应用时,则该配置类生效。

@ConditionalOnWebApplication(type = SERVLET)


@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional({OnWebApplicationCondition.class})
public @interface ConditionalOnWebApplication {
    ConditionalOnWebApplication.Type type() default ConditionalOnWebApplication.Type.ANY;

    public static enum Type {
        ANY,        // 任何web环境
        SERVLET,    // servlet环境
        REACTIVE;   // reactive环境

        private Type() {
        }
    }
}

7、@ConditionalOnExpression

条件是:如果满足指定表达式时,则该配置类生效。

@ConditionalOnExpression("!'${security.oauth2.client.clientId}'.isEmpty()")

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Conditional({OnExpressionCondition.class})
public @interface ConditionalOnExpression {
    String value() default "true";
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值