首页 > 其他分享 >为什么@Resource无法注入泛型类型而@Autowired可以

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

时间:2023-09-24 21:22:24浏览次数:29  
标签:userRepository Resource Autowired 类型 泛型 注入

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

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

``` java
@Autowired
private Repository<User> userRepository;
```

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

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

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

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

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

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

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

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

标签:userRepository,Resource,Autowired,类型,泛型,注入
From: https://www.cnblogs.com/huanledo/p/17726699.html

相关文章

  • 3.泛型
    泛型泛型的好处:统一数据类型;把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来;泛型的细节:java中的泛型是伪泛型,添加后,其内部依旧是按Object类型进行处理的;泛型中不能写基本数据类型;指定泛型的具体数据类型后,传......
  • 【Java 基础篇】Java类型通配符:解密泛型的神秘面纱
    在Java中,类型通配符(TypeWildcard)是泛型的重要概念之一。它使得我们能够更加灵活地处理泛型类型,使代码更通用且可复用。本文将深入探讨Java类型通配符的用法、语法和最佳实践。什么是类型通配符?类型通配符是一个用问号?表示的通配符,它可以用于泛型类、方法和通配符边界。类型通配......
  • 【Java 基础篇】Java 泛型:类型安全的编程指南
    在Java编程中,泛型是一项强大的特性,它允许您编写更通用、更安全和更灵活的代码。无论您是初学者还是有经验的Java开发人员,了解和掌握泛型都是非常重要的。本篇博客将从基础概念一直深入到高级应用,详细介绍Java泛型。什么是泛型?泛型是Java编程语言的一项特性,用于实现通用性更......
  • Ubuntu通过certbot手动配置Let's Encrypt SSL泛型域名证书
    1.安装Snap使用命令安装snap,以及core组件sudoaptinstallsnapdsudosnapinstallcoresudosnaprefreshcore2.移除旧有的certbotsudoapt-getremovecertbotsudodnfremovecertbotsudoyumremovecertbot3.安装certbotsudosnapinstall--classiccertbot......
  • 集合框架和泛型
    1、setHashSet不重复,无序。TreeSet不重复,会自动排序,升序。importjava.util.TreeSet;importjava.util.Set;publicclassTree{publicstaticvoidmain(String[]args){Setset=newTreeSet<>();set.add("GG");set.add("gg")......
  • Java(day20):泛型和枚举
    前言Java是一种面向对象的、跨平台的编程语言,在软件开发中应用广泛。在Java中,泛型和枚举是两种重要的特性,它们能够提高代码的可读性和重用性。本文将介绍Java泛型和枚举的概念、语法、使用方法、测试用例等方面。摘要泛型是Java的一种抽象类型,它允许使用者在编写代码时不指定数......
  • 多个泛型如何设置约束
    提问多个泛型如何设置约束回答publicabstractclassHandleBase<Req,Ack>whereReq:RequestInfoBasewhereAck:AckInfoBase补充泛型优点避免类型转换,可以减少大量继承关系中的as操作......
  • [Spring]浅谈Spring的Resources体系
    Spring为什么要创建Resources体系Java的标准java.net.url类和各种URL前缀的标准处理程序无法满足所有对low-level资源的访问.举个例子:没有标准化的URL实现类用于获取根据ServletContext的类路径。并且缺少某些Spring所需要的功能,例如检测某资源是否存在等。ResourceSpring的Resour......
  • class path resource [.xml] cannot be opened because it does not exist
    classpathresource[bean1.xml]cannotbeopenedbecauseitdoesnotexist错误重现bug:Exceptioninthread"main"org.springframework.beans.factory.BeanDefinitionStoreException:IOExceptionparsingXMLdocumentfromclasspathresource[bean1.xml]......
  • 解决pycharm报错:_jb_pytest_runner.py:7:....from pkg_resources import iter_entry_p
    遇到问题执行pytest用例出现警告D:\pycharm\PyCharm2020.1.5\plugins\python\helpers\pycharm_jb_pytest_runner.py:7:DeprecationWarning:pkg_resourcesisdeprecatedasanAPI.Seehttps://setuptools.pypa.io/en/latest/pkg_resources.htmlfrompkg_resourcesimport......