@Autowired和@Resource的区别详解

news/2024/4/16 4:01:09

1. @Autowired 配置
首先介绍 @Autowired 注解的配置,通过该注解可以实现自动装配 Bean 的依赖。例如以下的 OrderService 类,通过 @Autowired 注解将其依赖的 OrderRepository 对象实例化并注入:
@Service
public class OrderService {
    
    @Autowired
    private OrderRepository orderRepository;
    
    // ...
}
需要注意的是,在默认情况下,@Autowired 会按照类型进行依赖注入。如果容器中有多个同类型的 Bean,则会抛出异常。这时如果需要指定具体的 Bean,可以使用 @Qualifier 注解来实现。


@Service
public class OrderService {
    
    @Autowired
    @Qualifier("orderRepositoryImpl")
    private OrderRepository orderRepository;
    
    // ...
}
另外,还可以在构造器、Setter 方法以及其他自定义方法上使用 @Autowired 注解进行依赖注入。
@Service
public class OrderService {
    
    private OrderRepository orderRepository;
    
    @Autowired
    public OrderService(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }
    
    /**
     * Setter injection.
     */
    @Autowired
    public void setOrderRepository(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }
    
    /**
     * Custom method injection.
     */
    @Autowired
    public void injectOrderRepository(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }
    
    // ...
}
2. @Resource 配置
接下来介绍 @Resource 注解的配置,同样可以实现自动装配 Bean 的依赖。相比于 @Autowired,它使用的是名称来进行依赖注入。

例如以下的 OrderService 类,通过 @Resource 注解将其依赖的 OrderRepository 对象实例化并注入:


@Service
public class OrderService {
    
    @Resource(name = "orderRepositoryImpl")
    private OrderRepository orderRepository;
    
    // ...
}
需要注意的是,默认情况下会根据属性名与 Bean 名称进行匹配。如果需要指定名称,则可以使用 name 属性来设置。

同时, @Resource 还支持 type 属性,可以按照类型来进行依赖注入。例如以下代码:


@Service
public class OrderService {
    
    @Resource(type = OrderRepository.class)
    private OrderRepository orderRepository;
    
    // ...
}
3. 区别比较
综上所述,两者的区别主要在于依赖注入的方式不同。

对于 @Autowired,它按照类型进行依赖注入,如果有多个同类型的 Bean 则需要使用 @Qualifier 来区分。而 @Resource 则按照名称或类型进行依赖注入,通过 name 或 type 属性进行配置。

在使用上,两者都可以实现自动装配 Bean 的依赖关系,但使用场景略有不同。一般情况下,如果我们只需要按照类型注入,那么优先使用 @Autowired。如果需要按照名称或类型注入,则优先使用 @Resource。

需要注意的是,在 Spring 5.1 及以上版本,@Autowired 和 @Qualifier 存在一个新的特性——默认注解值(Default Annotation Values)。即当按照类型进行注入时,可以通过 @Qualifier 注解的默认值来指定具体的 Bean 名称。这样 @Resource 在一定程度上的优势就被削弱了。
@Service
public class OrderService {
    
    @Autowired
    @Qualifier("orderRepositoryImpl")
    private OrderRepository orderRepository;
    
    // ...
}
因此,在使用时应该根据具体情况选择合适的注解来实现依赖注入。


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

相关文章

【Linux】安装node-v16.17.0-linux

【Linux】安装node-v16.17.0-linux 1 下载node-v16.17.0-linux-x64.tar.xz 下载地址:https://nodejs.org/zh-cn 2 解压文件 cd 到node-v16.17.0-linux-x64.tar.xz所在的路径 xz -d node-v16.17.0-linux-x64.tar.xz tar -xvf node-v16.17.0-linux-x64.tar 3 软…

vim操作命令

基础操作: Vim(Vi Improved)是一个高效的文本编辑器,它提供了许多快捷键和命令来帮助您更快地编辑文本。以下是一些常用的Vim操作命令: 模式切换: 普通模式(Normal mode)&#xf…

linux运维知识点

Linux作为一种开源操作系统,被广泛地应用于企业、政府和私人用户的计算机系统中,其优越的稳定性、安全性和灵活性使得 Linux 成为了云计算、大数据和人工智能等最热门领域的重要组成部分。对于从事 Linux 运维的人员来说,了解其知识点和技能是…

vscode编辑器,vue、小程序等语言适配eslint格式校验 + prettier 保存时自动修改格式

目的:自留备份,用者自取 基础配置 1 基于vscode编辑器,prettier插件需要下载 2 eslint配置项规则: https://eslint.bootcss.com/docs/rules/ 3 prettier配置项规则: https://prettier.io/docs/en/options.html 安装…

Maven 依赖管理 学习

目录 Maven 依赖管理 可传递性依赖发现 依赖范围 依赖管理 Maven 自动化部署 问题描述 解决方案 修改项目的 pom.xml Maven Release 插件 Maven Web 应用 创建 Web 应用 构建 Web 应用 部署 Web 应用 Maven 依赖管理 Maven 一个核心的特性就是依赖管理。当我们处…

瑞云渲染农场怎么用,瑞云渲染多少钱一分钟?

Renderbus瑞云渲染农场作为亚洲前沿的 云渲染平台,一直以“做最好的云渲染工具”为愿景,紧跟CG行业的技术创新与发展,致力于提供专业可靠、安全稳定、可持续创新的云渲染解决方案,助力推动行业快速发展,被誉为中国云渲…

C++模板详解(函数模板、类模板)

hello,这里是bangbang,今天来讲下模板 目录 1. 泛型编程 2. 函数模板 2.1 函数模板概念 2.2 函数模板格式 2.3 函数模板的实例化 2.4 模板参数的匹配原则 3. 类模板 3.1 类模板定义格式 3.2 类模板实例化 4. 非类型模板参数 5. 模板特化 5.1 模板特化概念 5.2…

C#套接字通信之UDP组播

文章目录 组播的概念简单示例组播的优势 组播的概念 UDP信息传递的方式分三类,分别是 单播 Unicast:客户端与服务器之间的点到点连接多播MultiCast:又称组播,是“一对一组”的通讯模式,加入同一个组的主机可以接受到…

kubespray部署k8s 1.26集群安装指南

Kubespray 是一个自由开源的工具,它提供了 Ansible 剧本(playbook) 来部署和管理 Kubernetes 集群。它旨在简化跨多个节点的 Kubernetes 集群的安装过程,允许用户快速轻松地部署和管理生产就绪的 Kubernetes 集群。 它支持一系列操作系统,包…

力扣 139. 单词拆分

一、题目描述 给你一个字符串 s 和一个字符串列表 word_dict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s。 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 示例 1: 输入: s "leetcode"…

Appium环境搭建及元素定位

Appium简介 Appium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序测试。它使用WebDriver 协议驱动iOS,Android和Windows应用程序。 01 环境搭建步骤 Appium环境安装: 第一步 安装 appium 桌面版客户端 Appium-1…

【动态代理】JDK动态代理与cglib动态代理源码解析

JDK动态代理 demo展示 UserService,接口类 public interface UserService {void addUser(); }UserServiceImpl,实现类 public class UserServiceImpl implements UserService {Overridepublic void addUser() {System.out.println("register al…

Liunx telnet 命令详解

文章目录 telnet补充说明语法选项参数实例 telnet 登录远程主机和管理(测试ip端口是否连通) 补充说明 telnet命令 用于登录远程主机,对远程主机进行管理。telnet因为采用明文传送报文,安全性不好,很多Linux服务器都不开放telnet服务&#…

【Java多线程编程】线程的六种状态

前言: 在我们进行多线程编程,脑海里会想到线程运行的状态到底是什么?因此我整理出这线程的状态这篇博文。线程的状态分为六种:新建状态(NEW)、就绪状态(RUNNABLE)、阻塞状态&#xf…

黑马头条(学习笔记)

​ 目录 一. 项目概述 二、项目初始化 移动端 REM 适配: 关于 PostCSS 配置文件: Autoprefixer 插件的配置 : postcss-pxtorem 插件的配置: 关于字体图标: 配置路由: 封装请求模块: 三:登录注册&…

lua实战(1)

目录 IDELua中的名称Lua是一种区分大小写的语言 Lua 是一个小巧的脚本语言。它是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo三人所组成的研究小组于1993年开…

ISO9001是什么?ISO9000和ISO9001有何关系?

ISO 9000和ISO 9001是质量管理领域的两个重要标准。它们被用来确保组织能够提供符合客户要求的产品和服务,同时不断提高其业务效率和质量水平。本文将探讨ISO 9000和ISO 9001之间的关系,解释它们的区别以及为什么对企业非常重要。 什么是ISO9000和ISO90…

zabbix数据库添加主从同步

zabbix数据库正常运行的情况下,做mysql主从同步添加从库操作 一,在从库主机上安装mysql(注:版本与主库master一致) 1.1,创建用户 groupadd mysql useradd -r -g mysql mysql1.2,上传&#xf…

8分钟的面试,我直呼太变态了......

干了两年外包,本来想出来正儿八经找个互联网公司上班,没想到算法死在另一家厂子。 自从加入这家外包公司,每天都在加班,钱倒是给的不少,所以也就忍了。没想到11月一纸通知,所有人不许加班,薪资…

程序员应该怎么自学才能入门 ?我来聊聊自己的经历

当你想成为一名程序员,如何自学入门是一个非常重要的问题。在这里我分享一下我的经验,希望能对你有所帮助。 首先,为了制定好你的学习路线,你可以在网上的培训机构网站找到一张基础路线图。这张路线图必须是跟行业对标的&#xf…
最新文章