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

news/2025/2/15 17:44:08/

@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,则报出异常。装配顺序如下图所示。

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

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

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

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

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

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

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

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

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

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

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


http://www.ppmy.cn/news/774801.html

相关文章

文本主题抽取:用gensim训练LDA模型

得知李航老师的《统计学习方法》出了第二版&#xff0c;我第一时间就买了。看了这本书的目录&#xff0c;非常高兴&#xff0c;好家伙&#xff0c;居然把主题模型都写了&#xff0c;还有pagerank。一路看到了马尔科夫蒙特卡罗方法和LDA主题模型这里&#xff0c;被打击到了&…

城市道路感受L2级智能驾驶:吉利博瑞GE深圳试驾体验

当你身处高油耗、高拥堵、路况复杂的城市空间&#xff0c;一款轻松自如、省心省油的智能座驾是每个人都渴望的。近两年&#xff0c;越来越多国产品牌实力闯入混合动力市场&#xff0c;为汽车消费者带来耳目一新的体验。 上周&#xff0c;趣味科技参加了吉利博瑞GE两款混合动力新…

智能家居 “孤岛”:群雄并起 标准混战

早上醒来&#xff0c;窗帘自动打开&#xff0c;电视为你播报今天天气&#xff0c;客厅里咖啡机也自动开启早餐模式&#xff0c;阵阵咖啡香味飘来&#xff0c;让你精神为之一振……这幅智能家居的美好图景颇为诱人。 但是&#xff0c;侯哥在使用智能家电过程中碰到了不少麻烦。 …

《炬丰科技-半导体工艺》无颗粒晶圆清洗干燥技术

书籍&#xff1a;《炬丰科技-半导体工艺》 文章&#xff1a;无颗粒晶圆清洗干燥技术 编号&#xff1a;JFKJ-21-986 作者&#xff1a;炬丰科技 引言 彻底消除半导体加工环境中所有可能的杂质对于实现亚微米至更低亚微米特征尺寸的ULSI器件非常重要。很明显&#xff0c;晶片表面…

Individual tree segmentation and tree-counting using supervised clustering

ABSTRACT 个体树木分割 (ITS) 或树木计数是精准林业和农业过程中的一项基础工作。与费时费力的人工检查不同,计算机视觉在基于无人机 (UAV) 的应用中显示出巨大的前景;此类应用之一包括森林资源清单中的自动树木计数问题。然而,由于树冠冠层的特殊性,如颜色渐变、形状不确…

《Photoshop智能手机APP界面设计》学习笔记-转

第一章 APP用户界面基础 1.1 手机UI设计相关基本概念 1.1.1 什么是UI设计 UI(Users Interface)即用户界面&#xff0c;它不仅仅是美化界面&#xff0c;还需要研究用户&#xff0c;让界面变得更友好、简洁、舒适、易用。用户界面无处不在。它可以是登录界面&#xff0c;也可以是…

【LaTeX笔记1】最全命令+符号

函数、符号及特殊字符 声调 语法效果语法效果语法效果\bar{x}\acute{\eta}\check{\alpha}\grave{\eta}\breve{a}\ddot{y}\dot{x}\hat{\alpha}\tilde{\iota} 函数 语法效果语法效果语法效果\sin\theta\cos\theta\tan\theta\arcsin\frac{L}{r}\arccos\frac{T}{r}\arctan\frac{L}{…

【自动驾驶定位要求论文翻译】Localization Requirements for Autonomous Vehicles

写在前面 自动驾驶定位模块是自动驾驶系统必不可少的模块之一&#xff0c;但对其精度的要求一直没有一个严格的标准。前段时间有幸阅读到Localization Requirements for Autonomous Vehicles这篇文章&#xff0c;为更好地进行学习自动驾驶定位技术并进行相关工作&#xff0c;本…