自定义加载Bean @Conditional注解详解

@Conditional是做什么的

@Conditional 是 Spring Framework 中的一个注解,它主要用于条件化地创建 bean。基于满足的特定条件,Spring 容器可以决定是否创建、配置或初始化一个 bean。
Spring Boot 提供了多个基于 @Conditional 的注解,用于常见的条件判断,例如:

  • @ConditionalOnBean:当指定的 bean 存在时创建 bean。
  • @ConditionalOnClass:当指定的类在类路径上存在时创建 bean。
  • @ConditionalOnMissingBean:当指定的 bean 不存在时创建 bean。
  • @ConditionalOnMissingClass:当指定的类在类路径上不存在时创建 bean。
  • @ConditionalOnProperty:根据指定的属性来决定是否创建 bean。
  • @ConditionalOnExpression:基于 SpEL 表达式的结果来创建 bean。
  • @ConditionalOnJava:基于 Java 版本条件来创建 bean。
  • @ConditionalOnWebApplication@ConditionalOnNotWebApplication:根据应用是否是 Web 应用来创建 bean。

看源码

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

了解一个功能从源码开始 , 可以传参数是实现Condition接口的一个类,那我再来看下Condition

@FunctionalInterface
public interface Condition {
    boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}

@Conditional 需要一个实现了 Condition 接口的类作为参数。Condition 接口定义了一个 matches 方法,该方法接收一个 ConditionContext 和一个 AnnotatedTypeMetadata 作为参数,并返回一个布尔值。如果 matches 方法返回 true,则条件满足,相应的 bean 会被创建;如果返回 false,则 bean 不会被创建。

@Conditional 注解可以与任何带有 @Bean 方法的配置类一起使用,或者与 @Configuration 类本身一起使用,以控制整个配置类的加载。但是,更常见的是将它应用于单个 @Bean 方法上。

public class MyOnPropertyCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment env = context.getEnvironment();
        return env.getProperty("my.property") != null;
    }
}

@Configuration
@Conditional(MyOnPropertyCondition.class)
public class MyConfiguration {

    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值