必须使用单个@ConditionalOnClass({A.class, B.class})注解声明多个类,Spring会逐个加载并仅当全部存在时条件才成立;若用两个独立注解或混用value/name则无效。

要在Spring Boot中让一个Bean或配置类仅在多个指定类同时存在于类路径时才生效,必须确保@ConditionalOnClass的判断逻辑严格满足“所有类都存在”的条件,否则Bean不会注册、配置不会加载。
@ConditionalOnClass判断多个类的写法
使用@ConditionalOnClass注解时,若需检查多个类是否都存在,必须将它们全部声明在value属性中,用逗号分隔;Spring Boot会逐个尝试加载这些类,只要有一个类在classpath中找不到,整个条件就判定为false。
第一步:在@Bean方法或@Configuration类上添加@ConditionalOnClass注解。
第二步:在value参数中传入多个Class对象,例如:@ConditionalOnClass({RabbitTemplate.class, Channel.class})。
第三步:确保项目依赖中确实包含对应jar包——比如RabbitMQ相关依赖必须已引入,否则RabbitTemplate和Channel类均不可见,条件直接失败。
用name属性指定多个全限定类名
当目标类在当前模块编译期不可见(如作为可选依赖、避免编译报错),应改用name属性传入字符串数组,绕过编译期校验。
方法一:@ConditionalOnClass(name = {"org.springframework.amqp.rabbit.core.RabbitTemplate", "com.rabbitmq.client.Channel"})
方法二:混合使用value和name不被支持,二者只能选其一。用name时,Spring会在运行时通过Class.forName()逐一尝试加载,任一字符串对应的类加载失败,条件即不成立。
常见错误与规避方式
错误写法:@ConditionalOnClass(RabbitTemplate.class) @ConditionalOnClass(Channel.class)——这是两个独立注解,Spring会分别判断,只要其中一个成立就可能触发注册,无法保证“同时存在”。
正确写法必须是单个注解包裹多个类,形如@ConditionalOnClass({A.class, B.class, C.class})。
注意:如果只写了@ConditionalOnClass(A.class)却误以为它也能控制后续@Bean方法的执行顺序或依赖关系,那是错的——它只作用于紧邻的被标注元素,不传递、不累积。









