@Conditional注解

简要说明

@Conditional注解来源于org.springframework.context.annotation包中,也就是它是Spring中的注解,并不是SpringBoot的注解,他的作用是为了bean的装载到容器中增加一个条件判断,在满足条件下才会装载到容器中,这个条件的实现我们可以进行自定义的。

它存在很多扩展注解(SpringBoot对conditional注解的扩展),如下:

  • @ConditionalOnBean

  • @ConditionalOnProperty

  • @ConditionalOnClass

  • @ConditionalOnMissingBean

  • @ConditionalOnMissingClass

  • @ConditionalOnExpression

  • 。。。。

    以上的注解均来自org.springframework.boot.autoconfigure.condition包中,即都是springboot进行扩展的注解

自定义加载条件类

1.创建自定义bean加载条件的类,并实现Condition接口,重写matches方法

public class OnXXXXXCondition implements Condition{
   
    @Override
	public final boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
   
        。。。。。。
    }
}

2.在需要添加条件加载的类或者方法是使用@Conditional注解,并将自定义加载条件类作为参数加入到@Conditional中

@Conditional(OnXXXXXCondition.class)
public @interface ConditionalOnXXXX {
   
    .....
}

SpringBoot相关注解详解

@ConditionalOnProperty(重)

这个注解在使用场景中是频繁和重要的,如我们自定义springboot的Starter时,增加对该组件开关的配置信息等。

@Configuration
@ConditionalOnProperty(value="xxx.yyy",havingValue="true",matchIfMissing="ture")
public class TestBean{
   
    ...
}

这个条件解释是: application.properties 或 application.yml 文件中 xxx.yyy 为 true 才会加载 TestBean 这个 Bean,如果没有匹配上也会加载,因为 matchIfMissing = true,默认值是 false,通常设置为false。

@ConditionalOnBean 和 ConditionalOnMissingBean

有时候我们需要某个 Bean 已经存在应用上下文时才会加载,那么我们会用到 @ConditionalOnBean`注解,

@Configuration
@ConditionalOnBean(OtherBean.class)
public class TestBean{
   
    ...
}

反之有时候我们需要某个 Bean 不存在于应用上下文时才会加载,那么我们会用到@ConditionalOnMissingBean 注解。

@ConditionalOnClass 和 @ConditionalOnMissingClass

和上一个用法一致,只不过判断某个类是否存在于 classpath 中作为加载条件,@ConditionalOnClass判断存在, @ConditionalOnMissingClass判断不存在。

@ConditionalOnExpression

如果我们有更复杂的多个配置属性一起判断,那么我们就可以用这个表达式了:

@Configuration
@ConditionalOnExpression("${xxx.yyy:ture} and ${zzz.kkk}:ture")
public class TestBean{
   
    ...
}

只有当两个属性都为 true 的时候才加载

。。。。

相关推荐

  1. @Conditional注解

    2024-02-23 05:08:01       50 阅读
  2. 一文看懂Spring中的@Conditional注解

    2024-02-23 05:08:01       38 阅读
  3. Spring 条件化Bean装配:深入理解 @Conditional 注解

    2024-02-23 05:08:01       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-23 05:08:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-23 05:08:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-23 05:08:01       82 阅读
  4. Python语言-面向对象

    2024-02-23 05:08:01       91 阅读

热门阅读

  1. OpenAI Sora文本生成视频注册教程

    2024-02-23 05:08:01       79 阅读
  2. layui-tab加载echarts宽度丢失

    2024-02-23 05:08:01       52 阅读
  3. IMAP4揭秘:实现高效、灵活的电子邮件管理

    2024-02-23 05:08:01       45 阅读
  4. 力扣刷题记录:46_全排列(中)

    2024-02-23 05:08:01       58 阅读
  5. 解决windows无法访问wsl下docker服务

    2024-02-23 05:08:01       49 阅读
  6. 力扣49.字母异位词分组

    2024-02-23 05:08:01       52 阅读
  7. winform布局

    2024-02-23 05:08:01       54 阅读
  8. Python基础20 面向对象(3)多态、封装、反射

    2024-02-23 05:08:01       51 阅读
  9. 【CF】团队训练赛1 J-Mex Tree 题解

    2024-02-23 05:08:01       57 阅读
  10. vs code Conda退出虚拟环境报错 ERROR REPORT

    2024-02-23 05:08:01       62 阅读