五个维度,解析 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 {

    //资源的JNDI名称。在spring的注入时,指定bean的唯一标识。
    String name() default "";
 
    //引用指向的资源的名称。它可以使用全局JNDI名称链接到任何兼容的资源。
    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)
@Documented
public @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,spring,java,数据库 

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

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

五个维度,解析 Spring 中 @Autowired 和 @Resource 的区别,# spring,spring,java,数据库

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

五个维度,解析 Spring 中 @Autowired 和 @Resource 的区别,# spring,spring,java,数据库

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

五个维度,解析 Spring 中 @Autowired 和 @Resource 的区别,# spring,spring,java,数据库

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

五个维度,解析 Spring 中 @Autowired 和 @Resource 的区别,# spring,spring,java,数据库 

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

五个维度,解析 Spring 中 @Autowired 和 @Resource 的区别,# spring,spring,java,数据库

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

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

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

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

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

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

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

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

相关文章

  • 了解Spring中的依赖注入:@Autowired vs. @Resource

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

    2024年02月02日
    浏览(53)
  • @Resource和@Autowired的区别

    @Resource和@Autowired这两个注解的作用都是在Spring生态里面去实现Bean的依赖注入 首先,@Autowired是Spring里面提供的一个注解,默认是根据类型来实现Bean的依赖注入。 @Autowired注解里面有一个required属性默认值是true,表示强制要求bean实例的注入,在应用启动的时候,如果IOC容器里

    2024年02月08日
    浏览(42)
  • autowired和resource注解的区别

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

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

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

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

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

    2024年02月03日
    浏览(49)
  • 深入解析 Spring Framework 中 @Autowired 注解的实现原理

    关于@Autowired注解的作用 @Autowired 注解在Spring中的作用是实现依赖注入(Dependency Injection),它用于自动装配(autowiring)Spring Bean 的依赖关系。具体来说, @Autowired 注解有以下作用: 自动装配依赖 :通过在类的字段、构造函数、方法参数等地方使用 @Autowired 注解,Spring 容器会

    2024年02月08日
    浏览(39)
  • 深入解析 Spring 的 @Autowired:自动装配的魔法与细节

    @Autowired 是 Spring 框架中的一个重要注解,用于自动装配 bean 依赖。Spring 通过 @Autowired 可以自动将匹配的 bean 注入到需要的地方,如属性、构造函数或 setter 方法等。 下面是 @Autowired 注解的详细说明: 作用 自动装配 : @Autowired 注解能够自动装配 Spring 容器中的 bean,使得开发

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

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

    2023年04月25日
    浏览(31)
  • @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 @Autowired 注解原理

    被扫描的组件配置类 输出结果 定位@Autowired所在包 org.springframework.beans.factory.annotation.Autowired 找到同包下 AutowiredAnnotationBeanPostProcessor AutowiredAnnotationBeanPostProcessor 的类继承图如下 AutowiredAnnotationBeanPostProcessor实现了InstantiationAwareBeanPostProcessor与 MergedBeanDefinitionPostProcessor两个Bea

    2024年02月16日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包