当前位置: 首页 > 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适用于各种需要…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...