@ConditionalOnClass应优先使用Class对象而非字符串,如@ConditionalOnClass(DataSource.class);多类需同时存在时可用数组@ConditionalOnClass({A.class,B.class})或重复注解;字符串形式必须严格匹配全限定名,否则条件失效。

在Spring Boot中使用@ConditionalOnClass注解时,必须准确指定类的全限定名,否则条件判断会失效,导致Bean不按预期加载或启动失败。
直接写类的全限定名
在注解中直接传入Class对象,例如 @ConditionalOnClass(DataSource.class)。这是最安全的方式,编译期就能校验类是否存在,IDE也能自动补全和跳转。
不要写字符串形式如 @ConditionalOnClass("javax.sql.DataSource"),这种写法虽能通过编译,但运行时若类路径缺失,会抛出ClassNotFoundException且无法捕获,Spring容器启动直接失败。
多个类同时存在才生效
方法一:用数组语法传入多个Class
@ConditionalOnClass({JdbcTemplate.class, DataSource.class})
方法二:重复使用注解(Spring 5.2+支持)
@ConditionalOnClass(JdbcTemplate.class)
@ConditionalOnClass(DataSource.class)
两种写法等价,但数组写法更紧凑;若任一指定类缺失,整个条件即为false。
写字符串时必须带包名且不能有空格
第一步:确认目标类的完整包路径,例如 org.springframework.jdbc.core.JdbcTemplate
第二步:去掉.class后缀,保留全部包名和类名,中间用英文点号连接
第三步:写成字符串字面量,注意引号内【不能有多余空格、不能漏掉任何一级包名、不能写错大小写】
@ConditionalOnClass(value = "org.springframework.jdbc.core.JdbcTemplate")
写成 "springframework.jdbc.core.JdbcTemplate" 或 "org.springframework.jdbc.core.jdbctemplate" 都会导致条件永远不成立。















