@ConditionalOnClass怎样判断类路径

云枫君_5397

云枫君_5397

2026-08-09

924人浏览

原创

@ConditionalOnClass通过ClassLoader.loadClass()动态加载类来判断存在性,而非静态扫描;其在parse_configuration阶段触发,要求所有指定类均能成功加载才满足条件。

@conditionalonclass怎样判断类路径

要让 Spring Boot 在启动时准确判断某个类是否存在于类路径中,必须理解 @ConditionalOnClass 的真实工作方式——它不是扫描 jar 包或读取 class 文件,而是尝试用当前 ClassLoader 加载目标类。

@ConditionalOnClass 实际触发时机

Spring Boot 启动过程中,当 Configuration 类被解析时(即 parse_configuration 阶段),遇到 @ConditionalOnClass 注解,会立即调用其对应的 OnClassCondition.matches() 方法。

该方法内部执行 ClassUtils.isPresent(className, getClassLoader()),本质是调用 ClassLoader.loadClass(String name)。

只要不抛出 ClassNotFoundException 或 NoClassDefFoundError,就视为类存在;哪怕该类所在 jar 没有被依赖传递进来、或仅在 test scope 下,只要运行时 classpath 中能 load 到,条件即满足。

两种写法的加载行为差异

方法一:使用 Class 类型参数

@ConditionalOnClass(DataSource.class) → 编译期就能校验 DataSource 是否可访问,IDE 可提示、拼写错误会在编译时报出,推荐在项目内已有依赖时使用。

方法二:使用字符串类名参数

朱雀AI检测
朱雀AI检测

朱雀AI检测是一款AI工具,腾讯推出的AI内容检测助手。

下载

@ConditionalOnClass(name = "org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration") → 绕过编译期检查,适用于目标类尚未引入依赖(如可选模块)、或类名来自第三方未导出包的情况;但写错全限定名不会编译报错,只有启动时才失败。

【name 属性值必须是运行时实际存在的类全限定名,不能是接口、抽象类别名或不存在的别名】

多类判断的逻辑顺序

第一步:@ConditionalOnClass({JdbcTemplate.class, DataSource.class}) 要求两个类全部存在才通过。

第二步:Spring 会按数组顺序依次尝试加载每个类,一旦某个类加载失败(ClassNotFoundException),立刻中断并返回 false,后续类不再检查。

第三步:即使 JdbcTemplate 所在的 spring-jdbc.jar 已引入,但 DataSource 来自 spring-boot-autoconfigure,若该 jar 未出现在最终 classpath(例如 Maven 依赖被 exclude),整个条件仍不满足。

这一步没有缓存机制,每次 matches() 调用都重新执行 loadClass,所以类路径变动后重启应用才生效。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

2024.01.03

4356

7

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

2025.12.06

306

9

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

2024.01.03

4356

7

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

2025.12.06

306

9

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

2026.11.03

0

18

Docker Desktop镜像构建教程
Docker Desktop镜像构建教程

想使用Docker Desktop将本地项目构建成Docker镜像?本专题围绕镜像构建的实际操作展开,介绍Dockerfile编写、构建命令使用、镜像标签设置和构建日志查看等内容,同时整理镜像无法生成、依赖安装失败及构建缓存异常等问题的排查思路。

2026.11.03

0

11

Docker Desktop容器创建指南
Docker Desktop容器创建指南

本专题聚焦Docker Desktop容器创建与运行配置,介绍通过本地镜像或远程镜像创建容器的方法,以及容器启动、终端访问、日志查看和基础管理等操作。针对端口冲突、参数配置不当、容器无法启动等情况,也整理了相应的排查方向。

2026.11.03

0

11

Tailwind CSS 如何制作导航栏和卡片
Tailwind CSS 如何制作导航栏和卡片

用 Tailwind CSS 制作导航栏和卡片,可先搭建语义化结构,再组合 Flex、Grid、间距、圆角与阴影类。这里整理横向导航、移动端菜单、卡片网格及悬停效果的相关文章,帮助你把常见页面组件做得清晰且适配不同屏幕。

2026.11.03

0

17

Tailwind CSS 响应式布局怎么写
Tailwind CSS 响应式布局怎么写

Tailwind CSS 响应式布局通常从移动端样式写起,再用 sm、md、lg 等前缀调整不同屏幕宽度下的网格、间距和导航。本专题整理断点配置、Grid 与 Flex 自适应布局及常见溢出问题,帮助你逐步完成多设备适配。

2026.11.03

0

19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习