为什么@Resource无法注入泛型类型而@Autowired可以

在Spring框架中,我们通常使用@Autowired和@Resource两个注解来实现属性注入。但是当涉及到泛型类型时,使用@Resource注解就会失败,而@Autowired可以正常工作。这篇文章就来分析它们之间的区别。

@Autowired可以直接注入泛型类型,例如:

@Autowired
private Repository<User> userRepository;

但如果使用@Resource,则会报错:

@Resource
private Repository<User> userRepository; //报错

这是因为@Autowired按照类型(byType)进行注入,可以直接注入Repository这种具体的泛型类型。而@Resource默认按名称(byName)注入,需要指定一个名称给容器中的bean。但是泛型类型信息在运行时会被擦除,导致无法使用泛型类型作为名称进行注入。

@Resource可以通过name属性指定一个bean名称来注入:

@Resource(name="userRepository")
private Repository<User> userRepository;

但这种方式需要在容器中明确定义一个名为“userRepository”的bean,不如@Autowired方便。

所以结论就是:@Autowired可以按类型直接注入泛型类型,而@Resource需要指定名称,无法使用泛型类型名作为名称,所以无法直接注入泛型类型。

这与两者的注入机制有关,@Autowired按类型,更灵活;@Resource默认按名称,在泛型场景下需要人工定制名称,不太方便。所以在实现泛型依赖注入时,通常建议使用@Autowired比较便捷。

posted @   是小陈呀  阅读(666)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
点击右上角即可分享
微信分享提示