@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();
}
}