You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现@ConditionalOnClass同时校验两个类?

实现同时校验多个类存在的条件判断

方法一:直接利用原生@ConditionalOnClass的数组参数

Spring原生的@ConditionalOnClass本身就支持传入多个类的数组,无需重复添加注解,仅通过数组形式就能同时校验所有指定类是否存在于类路径中:

@Configuration
@ConditionalOnClass({com.example.ClassA.class, com.example.ClassB.class})
public class MyConfig {
    // 你的配置逻辑
}

只有当ClassA和`ClassB都存在时,这个配置类才会生效。

方法二:自定义注解+自定义Condition

如果需要复用“同时校验多个类存在”的逻辑,可以通过自定义注解搭配自定义Condition实现:

1. 定义自定义注解

创建带有元注解的自定义注解,指定绑定我们的自定义Condition:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Conditional(OnAllClassesPresentCondition.class)
public @interface ConditionalOnAllClassesPresent {
    // 接收需要校验的类数组
    Class<?>[] value();
}

2. 实现自定义Condition

编写Condition实现类,遍历注解中指定的所有类,逐一检查是否能被类加载器加载:

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.util.ClassUtils;

public class OnAllClassesPresentCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        var attributes = metadata.getAnnotationAttributes(ConditionalOnAllClassesPresent.class.getName());
        if (attributes == null) {
            return false;
        }
        Class<?>[] requiredClasses = (Class<?>[]) attributes.get("value");
        // 逐个检查类是否存在
        for (Class<?> clazz : requiredClasses) {
            try {
                ClassUtils.forName(clazz.getName(), context.getClassLoader());
            } catch (ClassNotFoundException | NoClassDefFoundException e) {
                // 只要有一个类不存在,直接返回false
                return false;
            }
        }
        // 所有类都存在,返回true
        return true;
    }
}

3. 使用自定义注解

之后就可以像原生注解一样使用自定义的@ConditionalOnAllClassesPresent:

@Configuration
@ConditionalOnAllClassesPresent({com.example.ClassA.class, com.example.ClassB.class})
public class MyConfig {
    // 你的配置逻辑
}

注意:原生@ConditionalOnClass已经覆盖了多类校验的场景,优先使用方法一即可;自定义注解仅适合需要多次复用相同校验逻辑的场景。

内容的提问来源于stack exchange,提问作者Paco Pinazo Guna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 06:47:12