在 Spring 框架中,动态代理机制主要有两种:JDK 动态代理(基于接口)和 CGLIB 代理(基于子类)。 虽然早期的 Spring 默认遵循“有接口就用 JDK,没接口才用 CGLIB”的原则,但在某些特定情况或配置下,Spring 会强制降级/切换为 CGLIB 代理。以下是触发这种切换的核心场景: 1. 目标类没有实现任何“业务接口” (物理强制) 这是最根本的原因。JDK 动态代理的底层机制要求目标类必须实现至少一个接口。 完全无接口:如果一个类纯粹是一个普通类(POJO),没有实现任何接口,Spring AOP 在为其创建代理时,别无选择,只能通过生成子类的方式,即强制使用 CGLIB。 只有 Spring 内部标记接口:如果目标类仅仅实现了 Spring 的回调接口(如 , , 等)或 JDK 的标记接口(如 , ),Spring 的代理机制(类)会忽略这些非用户自定义的接口。此时,Spring 依然会认为该类没有实现“有效的业务接口”,从而强制切换为 CGLIB。 2. 代理 注解的配置类 (框架强制) 当你在类上使用 注解时,Spring 会在启动时使用 C...