Spring中@Autowired和@Resource的区别

简介: 有非常多的小伙伴从大厂毕业,导致招聘也卷得相当厉害,不管是应届生、中开、高开,都会问技术原理。还经常问一些日常开发不太需要了解的知识点对比。今天,就给大家分享一个应届生被问到的一道面试题,在Spring中,@Autowired注解和@Resource注解的区别。

有非常多的小伙伴从大厂毕业,导致招聘也卷得相当厉害,不管是应届生、中开、高开,都会问技术原理。还经常问一些日常开发不太需要了解的知识点对比。今天,就给大家分享一个应届生被问到的一道面试题,在Spring中,@Autowired注解和@Resource注解的区别。

另外,我花了1个多星期把往期的面试题解析配套文档准备好了,想获取的小伙伴可以在我的煮叶简介中找到。

好了,先来看@Autowired 这个注解。

1、@Autowired注解

@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;
    }
}

afe987a4268ae919935f6da606701711.png

2、@Resource注解


再来看@Resource这个注解,

35ab0d1294819c30361efb6e9022324a.png

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

3、@Resource和@Autowired的区别

那@Resource和@Autowired之间具体有哪些区别呢?我从以下五个方面来分析

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

8237180813925b537e12ae0c52688894.png

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

d7a2e1d064025f2258230d0cede629fb.png

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

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

dd86254140a3c1e9d12c0c08f2284ac5.png

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)、装配方式的默认值不同

ea85e0c3285af0a73cdca6526974f03e.png

@Autowired默认按type自动装配,而@Resource默认按name自动装配。当然,@Resource注解可以自定义选择,如果指定了name,则根据name自动装配,如果指定了type,则用type自动装配。

3)、注解应用的范围不同

@Autowired能够用在构造方法、成员变量、方法参数以及注解上,而@Resource能用在类、成员变量和方法参数上,这点从源码也能看得出来。

0528932d3ec85d12b347ddfef39bc364.png

@Autowired能够用在构造方法、成员变量、方法参数以及注解上,而@Resource能用在类、成员变量和方法参数上,这点从源码也能看得出来。@Target({TYPE, FIELD, METHOD})
@Retention(RUNTIME)
public @interface Resource {  ... }
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired { ... }
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired { ... }

4)、出处不同

208dc0bec15e59c5811c26878461a0cb.png

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

5)、装在顺序不同

bca63813eb41b4e60cde114fa603f3ab.png

@Autowired默认先按byType进行匹配,如果发现找到多个bean,则又按照byName方式进行匹配,如果还有多个,则报出异常。

f77ae0dbbe97d5f9253ed2acf22e9d5d.png

而@Resource的装载顺序分为四种情况:


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

bc5c29d78d3d5d20f11e48bd1377e89e.png2)如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常,具体流程如图所示:

daa36efea01f401bedd2cc1ca0b73bb7.png3) 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常,具体流程如图所示:

401f833b70f2c1e6f0f8a20f1c2c778a.png

4)如果既没有指定name,也没有指定type,则自动按byName方式进行装配。如果没有匹配,则回退为按照类型进行匹配。

7e4669262e2fdfb9ce62fcdbb8d63f1f.png

为了帮助大家更好地理解和区分,我还专门花时间整理一张表格。有需要的小伙伴可以关注我的主页介绍。

f20e849f08adf95fec2fc1895ef650fa.png

以上呢就是我对@Autowired与@Resource的总结和理解。总结一下,两者在功能上差别不大,使用起来也差不多。但是,在日常开发中,我建议使用@Autowired,有以下三个理由:

ce5756c3d5b5c37700781e51b14672f8.png

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

第2:若使用了Spring框架,使用其特有的注解个人感觉更好一点。

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

当然,这个跟我个人是Spring迷无关哈,如果你也是Spring的小迷粉,可以关注我,一起交流,共同进步。

相关文章
|
1月前
|
Java 测试技术 程序员
为什么Spring不推荐@Autowired用于字段注入?
作为Java程序员,Spring框架在日常开发中使用频繁,其依赖注入机制带来了极大的便利。然而,尽管@Autowired注解简化了依赖注入,Spring官方却不推荐在字段上使用它。本文将探讨字段注入的现状及其存在的问题,如难以进行单元测试、违反单一职责原则及易引发NPE等,并介绍为何Spring推荐构造器注入,包括增强代码可读性和维护性、方便单元测试以及避免NPE等问题。通过示例代码展示如何将字段注入重构为构造器注入,提高代码质量。
|
1月前
|
监控 Java 应用服务中间件
Spring和Spring Boot的区别
Spring和Spring Boot的主要区别,包括项目配置、开发模式、项目依赖、内嵌服务器和监控管理等方面,强调Spring Boot基于Spring框架,通过约定优于配置、自动配置和快速启动器等特性,简化了Spring应用的开发和部署过程。
50 19
|
1月前
|
Java 编译器 Spring
Spring AOP 和 AspectJ 的区别
Spring AOP和AspectJ AOP都是面向切面编程(AOP)的实现,但它们在实现方式、灵活性、依赖性、性能和使用场景等方面存在显著区别。‌
65 2
|
1月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
111 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
3月前
|
Java 数据库连接 数据库
Spring Data JPA 与 Hibernate 之区别
【8月更文挑战第21天】
83 0
|
2月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
1月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
162 2
|
8天前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
19 2
 SpringBoot入门(7)- 配置热部署devtools工具
|
4天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
15 2