每日一面系列-spring中@Autowired 和 @Resource 区别?

这篇具有很好参考价值的文章主要介绍了每日一面系列-spring中@Autowired 和 @Resource 区别?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

@Autowired注解是由Spring提供的,它可以用来对构造方法、成员变量及方法参数进行标注,它能够根据对象类型完成自动注入,代码如下。

public class Service {
    // 构造方法注入    @Autowired    public Service(Service service) {        this.service = service;    }
    // 成员变量注入    @Autowired    private Service service;     // 方法参数注入    @Autowired    public void setService(Service service) {        this.service = service;     }}

再来看@Resource注解,代码如下。

public class Service {

@Resource(name = "service1")

private Service service1;

@Resource(name = "service2")

private Service service2;

@Reource

private Service service3;

@Reource

private Service service4;

}

它是由JDK提供的,遵循JSR-250规范,是JDK 1.6及以上加入的新特性。作为Java的标准,它的作用和@Autowired无区别。与@Autowired不同的是,它适用于所有的Java框架,而@Autowired只适用于Spring。读者可以简单地理解为,@Resource能够支持对象类型注入,也能够支持对象名称注入。

@Resource和@Autowired之间具体有哪些区别呢?

可以从以下5个方面来分析。

1.注解内部定义的参数不同

@Autowired只包含一个required参数,默认为true,表示开启自动注入。

public @interface Autowired {
     // 是否开启自动注入,在不开启自动装配时,可设为false
    boolean required() default true; }

@Resource 包含7个参数,其中最重要的两个是name和type。

public @interface Resource {    // Bean的名称      String name() default "";     String lookup() default "";      // Java类,被解析为Bean的类型    Class<?> type() default java.lang.Object.class;     enum AuthenticationType {            CONTAINER,            APPLICATION    }     // 身份验证类型       AuthenticationType authenticationType() default AuthenticationType.CONTAINER;    // 组件是否可以与其他组件共享
    boolean shareable() default true;     String mappedName() default "";      // 描述    String description() default "";}

2.装配方式的默认值不同

@Autowired默认按type自动装配,而@Resource默认按name自动装配。@Resource注解可以自定义选择装配方式,如果指定name,则按name自动装配。如果指定type,则按type自动装配。

3.注解应用的范围不同

@Autowired能够用在构造方法、成员变量、方法参数及注解上,而@Resource能用在类、成员变量和方法参数上,源码如下。

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Autowired { ... }
@Target({TYPE, FIELD, METHOD})@Retention(RUNTIME)public @interface Resource {  ... }

4.出处不同

@Autowired是Spring定义的注解,而@Resource遵循JSR-250的规范,定义在JDK中。所以@Autowired只能在Spring框架下使用,而@Resource则可以与其他框架一起使用。

5.装配顺序不同

@Autowired默认先与byType进行匹配,如果发现找到多个Bean,则又按照byName方式进行匹配,如果还有多个Bean,则报出异常。装配顺序如下图所示。

每日一面系列-spring中@Autowired 和 @Resource 区别?,每日一面系列,spring,java,面试

而@Resource的装载顺序分为如下4种情况。

1)如果同时指定name和type,则从Spring上下文中找到与它们唯一匹配的Bean进行装配,如果找不到则抛出异常,具体流程如下图所示。

每日一面系列-spring中@Autowired 和 @Resource 区别?,每日一面系列,spring,java,面试

2)如果指定name,则从上下文中查找与名称(ID)匹配的Bean进行装配,如果找不到则抛出异常,具体流程如下图所示。

每日一面系列-spring中@Autowired 和 @Resource 区别?,每日一面系列,spring,java,面试

3)如果指定type,则从上下文中找到与类型匹配的唯一Bean进行装配,如果找不到或者找到多个就会抛出异常,具体流程如下图所示。

每日一面系列-spring中@Autowired 和 @Resource 区别?,每日一面系列,spring,java,面试

4)如果既没有指定name,也没有指定type,则自动按byName方式进行装配。如果没有匹配成功,则仍按照type进行匹配,具体流程如下图所示。

每日一面系列-spring中@Autowired 和 @Resource 区别?,每日一面系列,spring,java,面试

下面这张表可以帮助大家更好地理解和区分@Autowired和@Resource。

每日一面系列-spring中@Autowired 和 @Resource 区别?,每日一面系列,spring,java,面试

总结一下,两者在功能上差别不大,使用起来也差不多。但是,在日常开发中建议使用@Autowired,有以下3个理由。

第1:@Autowired功能略强大。支持优先注入、可以配置允许Bean不存在。

第2:若使用Spring框架,则使用其特有的注解更好一点。

第3:有人认为@Resource更加通用,因为它是一个规范,其他框架也会支持。目前后端都在用Spring,没有必要考虑其他框架。

面试点评:我们可以直接告诉面试官这两个注解的差异,同时基于两个注解的特性解释更多的差异,这样可以更好地体现自己对这方面知识的理解深度。面试官想考查求职者对Spring依赖注入方式的理解,以及对@Autowired和@Resource两个注解底层实现方面的区别的理解。求职者在理解了底层实现的差异后,回答这个问题会比较容易。文章来源地址https://www.toymoban.com/news/detail-532965.html

到了这里,关于每日一面系列-spring中@Autowired 和 @Resource 区别?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • autowired和resource注解的区别

    注入规则不同 Autowired注解是spring的注解,此注解只根据type进行注入,不会去匹配name.但是如果只根据type无法辨别注入对象时,就需要配合使用@Qualifier注解或者@Primary注解使用。 Resource注解有两个重要的属性,分别是name和type,如果name属性有值,则使用byName的自动注入策略,将值

    2024年02月10日
    浏览(48)
  • @Autowired 和 @Resource 的区别是什么?

    Java面试题目录 @Autowired 和 @Resource 的区别是什么? @Autowired 是 Spring 提供的注解。默认的注入方式为byType(根据类型进行匹配)。 @Resource 是 JDK 提供的注解。默认注入方式为 byName(根据名称进行匹配)。 当一个接口存在多个实现类的情况下,@Autowired 和@Resource都需要通过名称

    2024年01月19日
    浏览(48)
  • 简述@Autowired和@Resource的区别(通俗易懂)

    前言:在日常的开发项目当中,这两个注解是经常会用到的,但是在实际使用当中好像使用起来并没有多大区别,这里我就对这两个注解进行一个详细的区别总结,通过一个完整的典型例子进行论证,思路清晰明了。 目录 一、结论 二、典型案例 2.1、准备代码 2.2、使用@A

    2024年02月03日
    浏览(50)
  • Spring高手之路-@Autowired和@Resource注解异同点

    目录 概述 相同点 1.都可以实现依赖注入 2.都可以用于注入任意类型的Bean 3.都支持通过名称、类型匹配进行注入 不同点 1.来源不同。 2.包含的属性不同 3.匹配方式(装配顺序)不同。 4.支持的注入对象类型不同 5.应用地方不同 @Autowired 和 @Resource 是在 Java 开发中用于实现依赖

    2024年02月03日
    浏览(47)
  • 了解Spring中的依赖注入:@Autowired vs. @Resource

    在Spring框架中,依赖注入是一项关键的特性,通过它,我们能够更灵活、更方便地管理和使用各种组件。在依赖注入的实现中, @Resource 和 @Autowired 是两个常用的注解,它们分别具有不同的特点和用途。在本篇博客中,我们将深入探讨这两个注解的功能、优缺点,并提供一些

    2024年02月02日
    浏览(55)
  • @Autowired 和 @Resource的区别只知道注入方式不同?那可不行,其性能上也有差距!

    目录 Autowire vs Resource 性能比较 先上结论: @Resource查找Bean的时间复杂度为O(1): @Autowired查找Bean的时间复杂度为O(n): 不能将所有的@Resource无脑替换成@Autowired 结合源码分析Autowire vs Resource 性能比较 @Autowire注解的处理地方: org.springframework.beans.factory.annotation.AutowiredAnnotationBea

    2024年02月06日
    浏览(43)
  • Spring中@Resource和@Autowire注解的区别

    @Resource和@Autowired都是用来进行依赖注入的注解,但是它们有一些不同之处。 @Autowired是Spring框架中的注解,它可以用来标注字段、构造函数、方法等,表示需要自动装配。它可以用来注入依赖的bean。如果有多个bean符合条件,可能会抛出异常。 @Resource是Java自带的注解,它可以

    2023年04月25日
    浏览(33)
  • 使用@Component时再使用@Resource或@Autowired时注入失败问题

    在 @Component 注解的类下,再使用了 @Resource 或 @Autowired 注解。如此操作会导致依赖注入失败。 这是因为spring加载它们的顺序不同,在使用 @Component 注解将bean实例化到spring容器内的时候,因为 @Autowired 是在这个bean之中的,此时 @Autowired 还未完成自动装载,所以导致依赖注入的

    2024年02月06日
    浏览(38)
  • [Java网络安全系列面试题] HTTP和HTTPS协议区别和联系都有哪些?

    2.1 HTTP特点 1.支持客户/服务器模式。( C/S 模式) 2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有 GET 、 HEAD 、 POST 。每种方法规定了客户与服务器联系的类型不同。由于 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快。

    2024年04月23日
    浏览(49)
  • 每日一道面试题之Collection 和 Collections 有什么区别?

    Collection和Collections是Java集合框架中的两个重要的概念,它们在Java集合框架中扮演不同的角色。 Collection 是 Java集合框架中的一个接口 ,它是 所有集合类的根接口 , 用于操作和管理一组对象 ,Collection接口的常见实现类包括 List、Set和Queue 等,分别定义了不同的存储方式。

    2024年02月16日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包