@conditional注解底层依赖condition接口,该接口定义了matches()方法,接收conditioncontext和annotatedtypemetadata参数,返回boolean值决定bean是否注册。

要确认@Conditional注解底层依赖的接口类型,必须追溯到Spring框架源码中该注解的定义与运行时行为机制。
@Conditional注解底层接口是什么
打开Spring Framework 6.x或5.x的源码,定位到@Conditional注解声明处,可见其value属性要求传入一个Class extends Condition>[]数组。
这明确表明:@Conditional注解的底层核心接口是【Condition】。
Condition是一个函数式接口,仅定义一个抽象方法:boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata)。
Spring容器在解析被@Conditional标注的类或@Bean方法时,会实例化value中指定的Condition实现类,并立即调用其matches()方法;返回true才继续注册BeanDefinition,返回false则彻底跳过该Bean——整个过程发生在Bean实例化之前,不产生任何对象。
Condition接口两个参数的作用
Condition接口的matches方法接收两个关键参数,它们共同构成条件判断的上下文基础:
① ConditionContext:提供对Spring容器底层能力的访问入口,包括BeanDefinitionRegistry(注册表)、ConfigurableListableBeanFactory(Bean工厂)、Environment(环境配置)、ResourceLoader(资源加载器)、ClassLoader(类加载器)。
② AnnotatedTypeMetadata:封装被检查目标(@Configuration类或@Bean方法)上的全部注解元数据,支持反射读取如@Value、@Scope等其他注解的属性值。
这两个参数缺一不可。没有ConditionContext就无法读取application.yml中的spring.redis.host;没有AnnotatedTypeMetadata就无法知道当前@Bean方法是否还被@Primary或@Scope修饰。
Condition接口的典型实现方式
方法一:直接实现Condition接口
新建类MyFeatureCondition implements Condition,在matches()中通过context.getEnvironment().getProperty("feature.enabled")获取配置值并判断。
方法二:复用Spring Boot内置条件注解(推荐)
例如使用@ConditionalOnProperty(name = "feature.enabled", havingValue = "true"),它底层已绑定OnPropertyCondition.class,无需手写Condition实现类。
注意:自定义Condition类必须有无参构造器,否则Spring无法实例化,启动时抛出BeanCreationException。






