首页 > 其他分享 >@Autowired 和@Resource的区别

@Autowired 和@Resource的区别

时间:2024-08-12 17:06:03浏览次数:10  
标签:Resource 区别 Spring Autowired 查找 userService 注入

 

参考文章

终于有人把@Autowired 和 @Resource 的区别说清楚了!_autowired和resource区别-CSDN博客
https://blog.csdn.net/LJJ555a/article/details/132074655

 

重点总结

 

 

@Autowired 和 @Resource 都是 Spring/Spring Boot 项目中,用来进行依赖注入的注解。它们都提供了将依赖对象注入到当前对象的功能,但二者却有众多不同,并且这也是常见的面试题之一,所以我们今天就来盘它。
@Autowired 和 @Resource 的区别主要体现在以下 5 点:

    • 1.来源不同;
    • 2.依赖查找的顺序不同;
    • 3.支持的参数不同;
    • 4.依赖注入的用法不同;
    • 5.编译器 IDEA 的提示不同。

1.来源不同

@Autowired 和 @Resource 来自不同的“父类”,其中 @Autowired 是 Spring 定义的注解,而 @Resource 是 Java 定义的注解,它来自于 JSR-250(Java 250 规范提案)。

小知识:JSR 是 Java Specification Requests 的缩写,意思是“Java 规范提案”。任何人都可以提交 JSR 给 Java 官方,但只有最终确定的 JSR,才会以 JSR-XXX 的格式发布,如 JSR-250,而被发布的 JSR 就可以看作是 Java 语言的规范或标准。

2.依赖查找顺序不同

依赖注入的功能,是通过先在 Spring IoC 容器中查找对象,再将对象注入引入到当前类中。而查找有分为两种实现:按名称(byName)查找或按类型(byType)查找,其中 @Autowired 和 @Resource 都是既使用了名称查找又使用了类型查找,但二者进行查找的顺序却截然相反。

2.1 @Autowired 查找顺序

@Autowired 是先根据类型(byType)查找,如果存在多个 Bean 再根据名称(byName)进行查找,它的具体查找流程如下:

 

关于以上流程,可以通过查看 Spring 源码中的 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor#postProcessPropertyValues 实现分析得出,源码执行流程如下图所示:

 

 

2.2 @Resource 查找顺序

@Resource 是先根据名称查找,如果(根据名称)查找不到,再根据类型进行查找,它的具体流程如下图所示:

 

 

关于以上流程可以在 Spring 源码的 org.springframework.context.annotation.CommonAnnotationBeanPostProcessor#postProcessPropertyValues 中分析得出。虽然 @Resource 是 JSR-250 定义的,但是由 Spring 提供了具体实现,它的源码实现如下:

 

 

2.3 查找顺序小结

由上面的分析可以得出:

  • @Autowired 先根据类型(byType)查找,如果存在多个(Bean)再根据名称(byName)进行查找;
  • @Resource 先根据名称(byName)查找,如果(根据名称)查找不到,再根据类型(byType)进行查找。

3.支持的参数不同

@Autowired 和 @Resource 在使用时都可以设置参数,比如给 @Resource 注解设置 name 和 type 参数,实现代码如下:

 

@Resource(name = "userinfo", type = UserInfo.class)
private UserInfo user;

 

但二者支持的参数以及参数的个数完全不同,其中 @Autowired 只支持设置一个 required 的参数,而 @Resource 支持 7 个参数,支持的参数如下图所示:

 

 

4.依赖注入的支持不同

@Autowired 和 @Resource 支持依赖注入的用法不同,常见依赖注入有以下 3 种实现:

  • 属性注入
  • 构造方法注入
  • Setter 注入
    这 3 种实现注入的实现代码如下。

a) 属性注入

@RestController
public class UserController {
    // 属性注入
    @Autowired
    private UserService userService;

    @RequestMapping("/add")
    public UserInfo add(String username, String password) {
        return userService.add(username, password);
    }
}

 

b) 构造方法注入

@RestController
public class UserController {
    // 构造方法注入
    private UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @RequestMapping("/add")
    public UserInfo add(String username, String password) {
        return userService.add(username, password);
    }
}

 

c) Setter 注入

@RestController
public class UserController {
    // Setter 注入
    private UserService userService;

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    @RequestMapping("/add")
    public UserInfo add(String username, String password) {
        return userService.add(username, password);
    }
}

 

其中, @Autowired 支持属性注入、构造方法注入和 Setter 注入,而 @Resource 只支持属性注入和 Setter 注入,当使用 @Resource 实现构造方法注入时就会提示以下错误:

 

5.编译器提示不同

当使用 IDEA 专业版在编写依赖注入的代码时,如果注入的是 Mapper 对象,那么使用 @Autowired 编译器会提示报错信息,报错内容如下图所示:

 

 

虽然 IDEA 会出现报错信息,但程序是可以正常执行的。
然后,我们再将依赖注入的注解更改为 @Resource 就不会出现报错信息了,具体实现如下:

 

总结

@Autowired 和 @Resource 都是用来实现依赖注入的注解(在 Spring/Spring Boot 项目中),但二者却有着 5 点不同:

    • 来源不同:@Autowired 来自 Spring 框架,而 @Resource 来自于(Java)JSR-250;
    • 依赖查找的顺序不同:@Autowired 先根据类型再根据名称查询,而 @Resource 先根据名称再根据类型查询;
    • 支持的参数不同:@Autowired 只支持设置 1 个参数,而 @Resource 支持设置 7 个参数;
    • 依赖注入的用法支持不同:@Autowired 既支持构造方法注入,又支持属性注入和 Setter 注入,而 @Resource 只支持属性注入和 Setter 注入;
    • 编译器 IDEA 的提示不同:当注入 Mapper 对象时,使用 @Autowired 注解编译器会提示错误,而使用 @Resource 注解则不会提示错误.。
      如有侵权,请联系删除
      参考文献:https://developer.aliyun.com/article/1003903?spm=a2c6h.24874632.expert-profile.170.706570abMFaSAj

 

标签:Resource,区别,Spring,Autowired,查找,userService,注入
From: https://www.cnblogs.com/whoknows1/p/18355350

相关文章

  • RestController和Controller的区别和异同
     参考文章【SpringBoot】带你一文彻底搞懂RestController和Controller的关系与区别-CSDN博客https://blog.csdn.net/miles067/article/details/132567377 --------------------------------------------------------------------------------------------------------------......
  • 【面试】解释Attention和Self-Attention的区别
    面试模拟场景面试官:你能解释一下Attention和Self-Attention的区别吗?参考回答示例1.Attention机制基本概念:Attention是一种能够动态聚焦输入序列中不同部分的机制,允许模型根据需要选择性地关注输入数据的某些部分。这种机制最早被引入到机器翻译任务中,用于在翻译时......
  • C++对象的创建(堆和栈的区别)
    在C++中,对象的创建可以在两种不同的内存区域进行:堆(heap)和栈(stack)。这两种内存区域在管理方式、生命周期、性能和使用场景上有所不同。以下是堆和栈上对象创建的主要区别:栈上对象创建:自动内存管理:栈上的对象在创建时自动分配内存,在离开作用域时自动销毁,无需手动管理内存。生命......
  • USB PD和USB TYPE-C 的区别
    USBPowerDelivery(USBPD)和USBType-C是两个不同但相关的技术标准,它们在功能和应用上有所区别。1.USBType-C连接器标准:USBType-C是一种物理连接器标准。它定义了USB接口的外形和引脚排列。双面插入:USBType-C的设计使其可以双面插入,这意味着无论插头的正反......
  • @Valid 与 @Validated 的区别
    结论是:@Validated基本对我无用;@Valid与@Validated在Java开发中,特别是在进行数据校验时,扮演着重要的角色,但它们之间存在一些关键的区别。以下是对这两个注解的详细比较:一、定义与作用范围@Valid定义:@Valid是JavaEE提供的标准注解,它是JSR303规范的一部分,主要用于Hibernate......
  • 指针常量和常量指针的区别
    1.指针常量(ConstantPointer)定义:顾名思义指针常量是一个指针,它本身是常量,指向的地址不能改变,但可以改变指针所指向的值,(速记:指针是常量)声明:在C或C++中,可以使用const关键字来声明指针常量。例如:inta=10;int*constptr=&a;行为:在这个例子中,ptr......
  • Get 和 Post 的区别?什么情况下用到
    区别:1、GET使用URL或Cookie传参。而POST将数据放在BODY中2、GET的URL会有长度上的限制,则POST的数据则可以非常大3、POST比GET安全,因为数据在地址栏上不可见最本质的区别Get是用来从服务器上获得数据,而post是用来向服务器上传递数据Get/Post使用......
  • Python time模块与datetime模块的区别
    时间方面的编程在开发过程中是很常见的,而Python提供了datetime和time这两个关于时间的模块。接下来,我们将讨论这两个模块中的函数有什么区别。time模块:如果你想要获取当前的本地时间,那么首先你需要运行time.time()来获取当下的时间戳。importtime#获取目前的时间戳ti......
  • 工厂模式与策略模式的区别及其在Java中的应用
    工厂模式与策略模式的区别及其在Java中的应用1.引言在软件开发中,设计模式被广泛应用于解决各种常见问题,提高代码的可维护性、可扩展性和可读性。工厂模式(FactoryPattern)和策略模式(StrategyPattern)是两种非常重要的设计模式,它们解决了不同的设计问题,并且在许多情况下可......
  • snap和apt的区别简单了解[]
      Linux中没有tree命令的时候提示安装的时候出现了两个命令,简单看了看两者有何区别(一般用apt就可以了):  sudosnapinstalltree 和 sudoaptinstalltree 这两个命令都是用来安装 tree 命令行工具的,但它们使用的是不同的包管理器和软件源。Snapsnap 是由Canoni......