
本文介绍在 Spring Boot 中使用 @ConditionalOnClass 注解一次性校验多个类是否存在的标准方法,避免重复注解或自定义条件的复杂实现。
本文介绍在 spring boot 中使用 `@conditionalonclass` 注解一次性校验多个类是否存在的标准方法,避免重复注解或自定义条件的复杂实现。
Spring Boot 的 @ConditionalOnClass 是一个常用的条件化装配注解,用于在指定类存在于类路径(classpath)时才启用某个 Bean 或配置。虽然该注解本身是不可重复的(即不能在同一目标上多次声明),但它原生支持同时检查多个类——只需通过 name 属性传入字符串数组即可。
✅ 正确用法如下:
@Configuration
@ConditionalOnClass(name = {
"org.springframework.core.io.Resource",
"org.springframework.http.converter.json.Jackson2ObjectMapperBuilder"
})
public class JsonResourceConfig {
@Bean
public ObjectMapper objectMapper() {
return new Jackson2ObjectMapperBuilder().build();
}
}
该配置仅在 Resource 和 Jackson2ObjectMapperBuilder 两个类同时存在于类路径时生效。注意:这是逻辑与(AND)关系,而非 OR;只要任一指定类缺失,整个条件即不满足,配置将被跳过。
⚠️ 注意事项:
-
name属性接收的是全限定类名字符串(String[]),不是Class>[]—— 这是为了支持“类尚未加载”时的轻量级检查(避免ClassNotFoundException); - 若需检查已加载的类类型,可改用
value属性(接受Class>[]),但此时要求类必须能被当前类加载器解析,否则启动失败; - 不推荐为同一目标叠加多个
@ConditionalOnClass(如分别标注两次),因为 Spring 会将其视为独立条件,按“任意一个满足即生效”的逻辑处理(实际行为取决于条件评估顺序,不可靠且易引发歧义); - 自定义
Condition并非必要:除非需要动态、上下文感知(如结合环境变量或属性)的复杂判断,否则直接使用name数组更简洁、安全、符合 Spring Boot 惯例。
总结:无需自定义 Condition,也无需重复注解。利用 @ConditionalOnClass(name = {"A", "B"}) 即可优雅、高效地实现多类联合存在性校验,这是 Spring Boot 官方明确支持的标准用法。











