首页 > 其他分享 >@Autowired和@Resource的区别 详细讲解-包含面试题

@Autowired和@Resource的区别 详细讲解-包含面试题

时间:2024-09-19 14:52:49浏览次数:8  
标签:面试题 Resource Autowired Spring bean 注解 注入

@Autowired和@Resource的区别

一,介绍

1.@Autowired


@Autowired 是 Spring 框架提供的一个注解,它简化了依赖注入的过程。通常情况下,当我们需要让一个类使用另一个类的功能时,我们可以在前者中声明后者的一个实例。使用 @Autowired 注解后,Spring 容器会在运行时自动将合适的实例注入到声明了该注解的成员变量或构造函数中。

使用方式

  • 字段/接口注入:直接在需要注入的对象前加上 @Autowired

    @Autowired
    private UserRepository userRepository;
    
  • 构造函数注入:在构造函数参数上使用 @Autowired,这样可以确保依赖项不是可选的,并且在构造函数调用时就已经确定。

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
  • 方法注入:在 setter 方法或任意方法的参数上使用 @Autowired,这允许在运行时动态改变依赖关系。

    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    

配置选项

  • Required 属性:默认情况下,@Autowired 要求所注入的 bean 必须存在(即 required=true)。如果找不到对应的 bean,Spring 将抛出异常。

  • 如果设置 required=false,则允许 Spring 在找不到对应 bean 时不抛出异常,而是简单地忽略这个注入点。此时,未找到的 bean 对应的注入点将会保持为 null。

    @Autowired(required=false)
    private Cat cat;
    

注意事项

  • 当有多个相同类型的 bean 可供注入时,可以使用 @Qualifier 注解来明确指定注入哪个 bean。
  • 在使用 @Autowired 时,建议对必填的依赖使用构造函数注入,这样可以清晰地表明哪些依赖是必须的,同时也方便测试。
  • 使用 @Autowired 时,Spring 容器负责管理依赖关系的创建和管理,从而减轻了开发者的负担,使代码更加简洁。

2.@Resource

好的,让我们整理一下关于@Resource注解的信息,并以更清晰的方式呈现:


@Resource 是一个来自 javax.annotation 包的标准Java注解,用于依赖注入。尽管它最初设计用于JSR-250规范,并不专属于Spring框架,但是Spring也支持使用这个注解来进行依赖注入。

使用方式

@Resource 可以应用于类、成员变量或方法上,用于标记需要自动装配的资源。默认情况下,@Resource 是按照名字来查找注入的bean (byName),但如果找不到名字匹配的bean,则会退回到按类型注入 (byType)。

示例代码

import javax.annotation.Resource;

public class ServiceClass {
    @Resource(name = "userService")
    private UserService userService;

    public void performAction() {
        userService.doSomething();
    }
}

在这个例子中,ServiceClass 类有一个 userService 成员变量,它被 @Resource 注解修饰,并指定了名字 "userService"。这意味着Spring容器需要提供一个名为 "userService" 的bean来注入到 userService 变量中。

属性详解

name属性
  • name 属性用于指定要注入的bean的名字。
  • 如果指定了 name 属性,Spring会尝试根据该名字来查找匹配的bean。
  • 如果没有指定 name 属性,则默认使用成员变量的名字作为bean的名字进行查找。
type属性
  • type 属性用于指定要注入的bean的类型。
  • 如果指定了 type 属性,Spring会根据类型来查找匹配的bean。
  • 如果没有指定 type 属性,并且也没有 name 属性,则默认使用成员变量的类型进行匹配。

默认行为

如果既没有指定 name 也没有指定 type,那么Spring会先尝试按名字(byName)来查找匹配的bean。如果找不到匹配的名字,那么它会退回到按类型(byType)来查找。如果按类型找到了多个匹配的bean,则会抛出异常。

综合使用

当同时指定 nametype 时,Spring会首先尝试按名字查找匹配的bean。如果找到了,就直接注入;如果没有找到,那么它会继续按类型来查找。如果最终还是没有找到唯一匹配的bean,或者找到了多个,那么也会抛出异常。


二,@Autowired和@Resource的区别

您的描述中有一些地方需要澄清,特别是有关@Resource@Autowired的一些细节。以下是关于这两个注解之间的区别的准确说明:

  1. 提供者

    • @Autowired 是由Spring框架提供的,用于依赖注入。
    • @Resource 是来自 javax.annotation 包的标准Java注解,虽然Spring支持该注解,但它不是Spring独有的。
  2. 装配方式

    • @Autowired 默认按类型进行装配(byType)。如果要按名称装配,则需要结合 @Qualifier 注解来指定具体的bean名称。
    • @Resource 默认按名称进行装配(byName),如果找不到与名称匹配的bean,则退回到按类型装配(byType)。
  3. 依赖的bean存在性

    • @Autowired 默认情况下要求被注入的bean必须存在。如果找不到匹配的bean,则会抛出异常。然而,可以通过设置 @Autowired(required=false) 来忽略缺失的bean,此时如果没有找到匹配的bean,则注入点将为null。
    • @Resource 如果找不到与名称匹配的bean,则会按类型装配。如果仍然找不到,则会抛出异常,而不是不强制要求依赖的bean存在。
  4. 支持的自动装配类型

    • @Autowired 专门用于Spring框架内的bean装配。
    • @Resource 可以用于任何实现了JSR-250规范的应用程序中,并且不仅仅限于Spring框架,也可以在其他容器中使用。此外,@Resource 还可以用于EJB组件中。

简结

  • @Autowired 更加专注于Spring框架的上下文,而 @Resource 是更通用的依赖注入方式。
  • @Autowired 默认按类型装配,而 @Resource 默认按名称装配。
  • 两者都支持按类型装配,但 @Resource 先按名称装配,找不到才按类型装配。
  • 关于依赖的bean是否存在,两者都需要存在匹配的bean,除非特别配置。

在实际应用中,选择哪个注解取决于具体的需求和上下文环境。如果是在Spring框架内进行依赖注入,并且想要利用Spring的所有特性,那么@Autowired可能是更好的选择。而在需要更广泛兼容性的场景下,@Resource可能更适合。

标签:面试题,Resource,Autowired,Spring,bean,注解,注入
From: https://blog.csdn.net/qq_49841284/article/details/142359325

相关文章

  • JDK21中找不到 javax.annotation.Resource 了?
    在JDK9及以后版本,特别是到JDK21,javax.annotation.Resource这样的类已经不再包含在标准的JDK中。原因是从JDK9开始,Java进行了模块化(ProjectJigsaw),并移除了部分与JavaEE(现在称为JakartaEE)相关的包,例如javax.annotation。为什么会找不到javax.annotation.Resourc......
  • JVM常见面试题(三):类加载器,双亲委派模型,类装载的执行过程
    文章目录一、类加载器1.1什么是类加载器、类加载器作用1.2应用场景1.3类加载时机1.4类加载器分类1.4.1概述1.4.2JDK8及之前的版本1.4.3JDK9之后的类加载器二、双亲委派模型2.1什么是双亲委派模型2.2JVM为什么采用双亲委派机制2.3打破双亲委派机制2.4总结三......
  • HTML5+CSS3面试题:(第四天)
    目录13.cookie、localStorage、sessionStorage区别14.简述window对象除document以外的一些常用子对象,并描述其作用?15.css中水平垂直居中的方法有哪些?16.css如何做兼容的?13.cookie、localStorage、sessionStorage区别1.先介绍下cookie、localStorage、sessionStora......
  • Resource Acquisition Is Initialization
    在C++中,资源获取即初始化(RAII,ResourceAcquisitionIsInitialization)是一种管理资源的编程惯用法。其核心思想是将资源的获取和释放绑定到对象的生命周期中。具体来说:资源获取:在对象构造时获取资源,比如内存、文件句柄、网络连接等。将资源的句柄或指针保存在对象的成员......
  • Paper Reading: Deep forest auto-Encoder for resource-Centric attributes graph em
    目录研究动机文章贡献本文方法整体思想autoencoder预处理器深度森林编码生成器实验结果数据集和实验设置节点分类节点聚类用户推荐消融实验调参实验优点和创新点PaperReading是从个人角度进行的一些总结分享,受到个人关注点的侧重和实力所限,可能有理解不到位的地方。具体的细节......
  • C++面试题整理 2
    8.C++11新特性又哪些自动类型推导auto,智能指指针(share_ptr,unique_ptr等),for循环简化,线程相关的(std::thread/std::mutex),空指针nullptr,lambda表达式,等等9.share_ptr是线程安全的吗share_ptr里包含引用计数和数据指针,引用计数是原子操作,线程安全的,但是改变数据指针的指向,......
  • 【Kubernetes】常见面试题汇总(二十二)
    目录68.简述Helm及其优势?特别说明:题目1-68属于【Kubernetes】的常规概念题。68.简述Helm及其优势?(1)Helm是Kubernetes的软件包管理工具。类似Ubuntu中使用的apt、Centos中使用的yum或者Python中的pip一样。(2)Helm能够将一组K8S资源打包统一管理,是查......
  • 【Kubernetes】常见面试题汇总(二十一)
    目录65.简述Kubernetes中,如何使用EFK实现日志的统一管理?66.简述Kubernetes如何进行优雅的节点关机维护?67.简述Kubernetes集群联邦?65.简述Kubernetes中,如何使用EFK实现日志的统一管理?-在Kubernetes集群环境中,通常一个完整的应用或服务涉及组件过多,建议对......
  • ChatGPT中Java相关问答(包括Java基础知识和一些面试题)
    分享一个自己学习Java时的记录ChatGPT中的对话:ChatGPT链接包括如下问题HowtolearnJavainordertobecomeasoftwaredevelopmentengineer,pleasegivedetailsofthestudyprogramaswellasthereferencestudymaterials.详细解释java中的this引用解释一下类、......
  • JAVA-IO获取resource WEB-INF 中文件 JAR包中
    getResource+getPath()classPaththis.getClass().getClassLoader().getResource(StringUtils.EMPTY).getPath()Stringpath=this.getClass().getClassLoader().getResource(fileName).getPath();StringfilePath=URLDecoder.decode(path,StandardCharsets.UTF_8);......