当前位置: 首页 > news >正文

深入剖析 Java Spring 中的 @Autowired、@Resource、@Qualifier、@Inject 注解:使用详解与注意事项

文章目录

    • @Autowired:Spring 最常用的注解
      • 1. 作用与简介
      • 2. 使用示例
      • 3. 注意事项
    • @Resource:按名称注入的利器
      • 1. 作用与简介
      • 2. 使用示例
      • 3. 注意事项
    • @Qualifier:解决多 bean 注入问题
      • 1. 作用与简介
      • 2. 使用示例
      • 3. 注意事项
    • @Inject:标准化的依赖注入
      • 1. 作用与简介
      • 2. 使用示例
      • 3. 注意事项
    • 总结:如何选择正确的注解?
      • 1. 使用建议
      • 2. 注意事项
      • 推荐阅读文章

在使用 Spring 框架进行开发时,依赖注入(Dependency Injection, DI)是核心理念之一。它让我们可以轻松地管理对象之间的依赖关系,而不需要手动创建和维护这些依赖。在实现依赖注入时,Spring 提供了多种注解来简化开发流程,其中最常见的四种注解是 @Autowired@Resource@Qualifier@Inject

在这篇文章中,我将通过代码示例,详细介绍这些注解的使用方法,并总结一些使用中的注意事项,帮助你更高效地进行开发。


@Autowired:Spring 最常用的注解

1. 作用与简介

@Autowired 是 Spring 提供的专用注解,用来自动注入依赖。它可以用于构造器、字段、方法,甚至是多参数构造器或 setter 方法。

2. 使用示例

@Component
public class CarService {@Autowiredprivate Engine engine;  // 字段注入@Autowiredpublic CarService(Engine engine) {  // 构造器注入this.engine = engine;}@Autowiredpublic void setEngine(Engine engine) {  // Setter 方法注入this.engine = engine;}
}

在上述代码中,无论是字段、构造器还是 setter 方法,Spring 都会自动将 Engine 的实例注入到 CarService 中。

3. 注意事项

  • 推荐使用构造器注入:虽然字段注入最简单,但构造器注入更受推荐,因为它有助于保持对象的不可变性,方便测试和重构。

  • 处理可选依赖:如果某个依赖是可选的,可以通过 required=false 来避免依赖注入时抛出异常:

    @Autowired(required = false)
    private Engine engine;
    

@Resource:按名称注入的利器

1. 作用与简介

@Resource 是来自 JDK 的标准注解,它可以按名称或按类型进行依赖注入。默认情况下,它是按名称注入的。

2. 使用示例

@Component
public class CarService {@Resource(name = "v8Engine")  // 按名称注入private Engine engine;
}

在上面的代码中,Spring 会查找名为 v8EngineEngine 实例并注入到 CarService 中。

3. 注意事项

  • 名称优先@Resource 优先按名称注入,如果未指定名称,它会使用变量名作为默认名称。如果找不到对应的 bean,才会按类型注入。因此,确保 bean 名称与变量名或指定的名称一致。
  • 不支持 required=false@Resource 不支持像 @Autowired 那样的 required 属性,因此如果依赖没有找到,它将抛出异常。

@Qualifier:解决多 bean 注入问题

1. 作用与简介

当 Spring 容器中有多个相同类型的 bean 时,@Qualifier 注解可以帮助我们明确指定哪个 bean 应该被注入。它通常与 @Autowired@Inject 一起使用。

2. 使用示例

@Component
public class CarService {@Autowired@Qualifier("v8Engine")  // 指定要注入的具体 beanprivate Engine engine;
}

在这里,即使有多个 Engine 实现类,Spring 仍会通过 @Qualifier("v8Engine") 来指定注入的 v8Engine 实例。

3. 注意事项

  • 明确指定 bean 名称:当有多个同类型的 bean 时,使用 @Qualifier 是必要的,否则 Spring 会抛出 NoUniqueBeanDefinitionException 异常。
  • 与其他注解搭配使用@Qualifier 通常与 @Autowired@Inject 搭配使用,用于解决多实例时的注入问题。

@Inject:标准化的依赖注入

1. 作用与简介

@Inject 是来自 JSR-330 的注解,与 @Autowired 类似,它用于实现依赖注入,但它是一个标准化的注解,适用于所有依赖注入框架。

2. 使用示例

import javax.inject.Inject;@Component
public class CarService {@Injectprivate Engine engine;  // 标准依赖注入
}

使用 @Inject@Autowired 的效果基本相同,但它具有更广泛的适用性,尤其在使用多种依赖注入框架时。

3. 注意事项

  • 不支持 required=false:与 @Autowired 不同,@Inject 没有 required 属性,所以所有依赖必须是必需的。
  • 支持 @Qualifier:与 @Autowired 一样,@Inject 也可以与 @Qualifier 一起使用,以指定注入的具体 bean。

总结:如何选择正确的注解?

注解来源默认注入方式是否支持 @Qualifier是否支持 required=false
@AutowiredSpring 特有按类型注入
@ResourceJDK 标准(javax.annotation按名称注入
@InjectJSR-330 标准按类型注入

1. 使用建议

  • 优先使用 @Autowired:如果你的项目完全依赖于 Spring 框架,@Autowired 是最灵活和强大的选择,尤其是它支持构造器注入和 required=false
  • 使用 @Resource 进行按名称注入:如果你需要按名称进行注入,@Resource 是最合适的选择。但要注意,@Resource 的功能相对有限。
  • 标准化项目使用 @Inject:如果你的项目需要兼容多个依赖注入框架,@Inject 是最佳选择,因为它是标准化的注解。
  • 多实例时使用 @Qualifier:当有多个同类型的 bean 时,@Qualifier 是解决模糊注入问题的利器,避免不必要的异常。

2. 注意事项

  • 避免字段注入:尽量避免字段注入,推荐使用构造器注入,这不仅有助于依赖的不可变性,还能提升代码的可测试性。
  • 使用 @Qualifier 解决多 bean 注入问题:如果存在多个同类型的 bean,一定要使用 @Qualifier 明确指定要注入的 bean,否则会出现 NoUniqueBeanDefinitionException 异常。
  • 可选依赖:在使用 @Autowired 时,如果某个依赖可能为空,记得使用 required=false,防止 Spring 因找不到 bean 而抛出异常。
  • 名称和类型冲突:在使用 @Resource 时,要特别注意 bean 名称和类型冲突问题,确保名称和实际注入的 bean 名称匹配,否则可能会导致注入失败。

通过了解这些注解的使用方式和特点,选择合适的注解不仅能够简化代码,还可以避免一些常见的注意事项。

推荐阅读文章

1、使用 Spring 框架构建 MVC 应用程序:初学者教程
2、有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误
3、如何理解应用 Java 多线程与并发编程?
4、Java Spring 中常用的 @PostConstruct 注解使用总结
5、线程 vs 虚拟线程:深入理解及区别
6、深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
7、10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!
8、“打破重复代码的魔咒:使用 Function 接口在 Java 8 中实现优雅重构!”
9、Java 中消除 If-else 技巧总结
10、线程池的核心参数配置(仅供参考)
11、【人工智能】聊聊Transformer,深度学习的一股清流(13)
12、Java 枚举的几个常用技巧,你可以试着用用

相关文章:

深入剖析 Java Spring 中的 @Autowired、@Resource、@Qualifier、@Inject 注解:使用详解与注意事项

文章目录 Autowired:Spring 最常用的注解1. 作用与简介2. 使用示例3. 注意事项 Resource:按名称注入的利器1. 作用与简介2. 使用示例3. 注意事项 Qualifier:解决多 bean 注入问题1. 作用与简介2. 使用示例3. 注意事项 Inject:标准…...

ThingsBoard规则链节点:Delete Attributes节点详解

引言 删除属性节点简介 用法 含义 应用场景 实际项目运用示例 智能家居安全系统 物流跟踪解决方案 工业自动化生产线 结论 引言 ThingsBoard是一个开源的物联网平台,它提供了设备管理、数据收集与处理以及实时监控等功能。其中,规则引擎是其核心…...

关于作为面试官以及如何准备面试的一些心得

关于作为面试官以及如何准备面试的一些心得 一、面试官(我站在前端角度来说) 当作为这样身份的时候,我想第一步应该是自己梳理一些从简到难、从点到面的问题 CSS - JS - 框架 - 项目 从这四个角度出发,一步一步的引导面试者的思…...

Bean对象 和 普通对象 的区别

Bean对象 和 普通对象 的区别 前言Bean的概念与new创建的对象的区别Spring Bean的优势两者使用的关键点总结 前言 在Spring框架中,我们通常将Spring容器管理的对象称为“Bean”或“Bean对象”。而通过new关键字创建的对象则被称为“对象”或“普通对象”。 Bean的…...

lego-loam featureAssociation 源码注释(二)

咱们接着往下看initializationValue();&#xff01;&#xff01;&#xff01; FeatureAssociation():nh("~"){subLaserCloud nh.subscribe<sensor_msgs::PointCloud2>("/segmented_cloud", 1, &FeatureAssociation::laserCloudHandler, this);s…...

Claude 3.5 的六大应用场景

Claude 3.5 的六大应用场景 随着人工智能技术的飞速发展&#xff0c;Claude 3.5 已经成为一款强大的语言模型工具&#xff0c;在多个领域展现了其卓越的应用潜力。本文将通过CSDN格式&#xff0c;介绍Claude 3.5在六大主要领域的实际应用场景&#xff0c;帮助开发者和企业更好…...

进程线程知识总结

1. 程序什么时候应该使用线程&#xff0c;什么时候单线程效率高 使用线程&#xff1a;在I/O密集型或高并发的场景&#xff0c;例如网络服务、文件读写等。通过多线程可以同时处理多个任务&#xff0c;提高利用率。单线程效率高&#xff1a;在CPU密集型任务中&#xff0c;当任务…...

Rsync数据复制/备份服务应用

文章目录 1. rsync概述1.1 什么是Rsync1.2 rsync的功能1.3 rsync 的功能特性1.4 Rsync 增量复制原理1.5 生产场景架构集群备份方案 2. Rsync工作方式介绍与实践2.1 本地数据传输模式2.1.1 本地数据传输模式语法2.1.2 本地数据传输模式实践 2.2 远程Shell 数据传输模式2.2.1 远程…...

如何为自己的跨境网站添加多国语言翻译功能及推荐起尔网定制与插件开发

如何为自己的跨境网站添加多国语言翻译功能及推荐起尔网定制与插件开发 在全球化的浪潮下&#xff0c;跨境电商成为越来越多企业拓展国际市场的重要途径。然而&#xff0c;语言障碍成为了一个不可忽视的问题。为了更好地服务全球用户&#xff0c;为自己的跨境网站添加多国语言…...

安全见闻(3)——开阔眼界,不做井底之蛙

内容预览 ≧∀≦ゞ 安全见闻三&#xff1a;脚本程序与病毒声明导语脚本语言BAT/PowerShell脚本木马与宏病毒脚本病毒BIOS病毒 结语 安全见闻三&#xff1a;脚本程序与病毒 声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只…...

MySQL 的意向锁(Intention Locks)原理详解

1. 背景&#xff1a;为什么需要意向锁&#xff1f; MySQL 中意向锁的主要作用是用于支持行级锁与表级锁的并存&#xff0c;特别是在 InnoDB 存储引擎中。InnoDB 提供了行级锁&#xff0c;而在某些场景下&#xff0c;数据库系统仍需要对整张表加锁&#xff0c;例如 LOCK TABLES …...

31个省份农业科技水平(农业技术创新或农业科技专利数据)2010-2022年

一、测算方式&#xff1a;参考C刊《湖北大学学报(哲学社会科学版)》张金鑫&#xff08;2020&#xff09;老师的做法&#xff0c;采用农业( 农林牧渔业) 三类专利总和来衡量农业技术创新 二、资料范围&#xff1a;31个省份&#xff0c;403个观测值&#xff0c;已经整理成面板数…...

Python代码执行失败问题及解决方案

目录 一、Python代码执行失败的原因 二、常见的Python错误类型 1. 语法错误&#xff08;SyntaxError&#xff09; 2. 运行时错误&#xff08;RuntimeError&#xff09; 3. 类型错误&#xff08;TypeError&#xff09; 4. 导入错误&#xff08;ImportError&#xff09; 5…...

Java 遗传算法

遗传算法&#xff08;Genetic Algorithm, GA&#xff09;是一种基于自然选择和遗传学原理的优化算法&#xff0c;用于求解复杂的搜索和优化问题。在Java中实现遗传算法通常包括以下几个步骤&#xff1a; 初始化种群&#xff1a;生成一组随机解作为初始种群。适应度评估&#x…...

C++ (一) 基础语法

基础语法&#xff1a;C的开胃小菜 欢迎来到C的世界&#xff0c;这里是编程的盛宴&#xff0c;也是逻辑的迷宫。别担心&#xff0c;我们不会一开始就让你啃硬骨头&#xff0c;而是从基础语法开始&#xff0c;让你慢慢品尝编程的美味。准备好了吗&#xff1f;让我们开始这场编程…...

Qt/C++路径轨迹回放/回放每个点信号/回放结束信号/拿到移动的坐标点经纬度

一、前言说明 在使用百度地图的路书功能中&#xff0c;并没有提供移动的信号以及移动结束的信号&#xff0c;但是很多时候都期望拿到移动的哪里了以及移动结束的信号&#xff0c;以便做出对应的处理&#xff0c;比如结束后需要触发一些对应的操作。经过搜索发现很多人都有这个…...

C 语言介绍及操作案例

C 语言是一种广泛使用的通用编程语言,具有高效、灵活和可移植性强等特点。 一、C 语言的基本特点 简洁高效 C 语言语法简洁,表达能力强。它提供了丰富的数据类型和运算符,可以方便地进行各种计算和操作。C 语言的代码执行效率高,能够直接访问硬件资源,适用于对性能要求较…...

Ivanti云服务被攻击事件深度解析:安全策略构建与未来反思

攻击事件背景 近期&#xff0c;威胁情报和研究机构Fortinet FortiGuard Labs发布了一份关于针对IT解决方案提供商Ivanti云服务设备&#xff08;Ivanti Cloud Services Appliance&#xff0c;CSA&#xff09;的复杂网络攻击的详细分析。 该攻击被怀疑是由国家级对手发起&#xf…...

如何做出正确选择编程语言:关于Delphi 与 C# 编程语言的优缺点对比

概述 为您的项目选择正确的技术可能是一项相当棘手的任务&#xff0c;尤其是当您以前从未需要做出这样的选择时。如今可用的选项范围非常广泛。虽然一些编程语言和工具有着相当悠久的历史&#xff0c;但其他一些则是刚刚开始赢得开发人员青睐的新手。 在这篇博文中&#xff0…...

39.3K Star,一个现代的数据库ORM工具,专为Node.js和TypeScript设计

大家好&#xff0c;今天给大家分享一个现代的数据库对象关系映射&#xff08;Object-Relational Mapping&#xff0c;ORM&#xff09;工具Prisma ORM&#xff0c;它旨在简化数据库操作&#xff0c;提高开发效率&#xff0c;并确保类型安全。 项目介绍 Prisma ORM适用于各种需要…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...