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$$dfd1a00agetBeanType()返回原始控制器类:<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
相关产品推荐
相关产品推荐

