如何实现@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
相关产品推荐
相关产品推荐

