You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring中HandlerMethod的getBeanType()与getBean().getClass()注解获取差异问题

Spring中getBeanType()与getBean().getClass()获取类注解的差异

问题场景

控制器代码示例:

@Tag(name = "Unita Offerta", description = "Rest Controller per unita offerta")
@Controller
@RequestMapping(value = { "/protected/unita-di-offerta" })
@Validated
@ProfiloSelezionato
public class UnitaOffertaController extends BaseRestController{
}

使用method.getBeanType().getAnnotation(clazz)能正常获取控制器类上的注解,但method.getBean().getClass().getAnnotation(clazz)却无法获取。调试发现:

  • getBean().getClass()返回动态代理类:<package>.UnitaOffertaController$$EnhancerBySpringCGLIB$$dfd1a00a
  • getBeanType()返回原始控制器类:<package>.UnitaOffertaController

二者核心区别

  • getBeanType():返回Spring注册的原始处理器类型,也就是你编写的UnitaOffertaController类本身,是Spring初始化时记录的Bean定义类型,与代码中定义的类完全一致。
  • getBean().getClass():返回运行时实际实例的类型。Spring会通过CGLIB(类无接口实现时)或JDK动态代理生成代理类,用于实现AOP、事务管理等增强功能,所以该方法返回的是代理后的增强类,而非你编写的原始类。

为何后者无法获取注解?

类上的注解直接标注在原始UnitaOffertaController类上,默认情况下Spring生成的CGLIB代理类不会继承原始类的注解(除非注解本身标记了@Inherited)。调用代理类的getAnnotation(clazz)时,只会查找代理类自身是否存在该注解,而代理类并没有这些注解,因此返回null。

而getBeanType()直接指向原始类,自然能获取到类上标注的所有注解。


内容的提问来源于stack exchange,提问作者Maverick_swat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 08:50:22