为什么Spring和IDEA不推荐使用@Autowired注解?
在Spring开发中,@Autowired注解是一个常用的依赖注入方式。但是,你可能会惊奇地发现,Spring和IDEA都不推荐使用@Autowired注解。关于这个问题,其实答案相对统一,实际上用大白话说起来也容易理解。
官方答案
首先,让我们看一下@Autowired注解。它的作用是自动注入依赖关系,避免手动编写冗长的构造函数或setter方法。这种方式很方便,但是也有一些缺点。首先,它是一个魔法注解。在代码中,你可能看不到明确的依赖关系,而这种魔法注解的使用会增加代码的复杂性。其次,它是一个运行时注解,会影响应用程序的性能。
在Spring的文档中,我们可以看到以下建议:
“尽管@Autowired注解是方便的,我们建议使用构造函数注入来明确表达依赖关系,并避免使用自动注入。”

为什么呢?因为构造函数注入可以提供明确的依赖关系,这样代码更容易理解和维护。并且,这种方式还能保证依赖关系的正确性,因为只有在所有的依赖项都可用的情况下才能创建对象。而对于@Autowired注解,如果依赖项不可用,则会在运行时抛出异常。
另一个问题
IDEA不推荐使用@Autowired注解的原因是它可能会导致代码的不可读性和不稳定性。在IDEA中,当你使用@Autowired注解时,它不会检查依赖关系是否存在,这可能会导致错误的行为。而使用构造函数注入,则可以在编译时检查依赖关系的正确性,并提供更好的代码提示和自动补全功能。
替换方案
使用@Resource注解
@Resource是JSR-250规范中定义的注解,它可以用来注入一个依赖的bean,类似于@Autowired注解。但是,@Resource注解具有更严格的匹配规则,它可以根据bean的名称、类型、甚至是注入位置进行匹配。这使得@Resource注解更加灵活、精确。
使用@Resource注解的方式如下所示:
@Service
public class MyService {@Resource(name = "myDao")private MyDao myDao;// ...
}
在这个例子中,MyService类中的myDao属性将会被注入一个名为“myDao”的bean。如果没有指定name属性,则@Resource注解会根据类型匹配bean。如果存在多个符合条件的bean,则会抛出一个异常。
使用@Inject注解
@Inject注解是Java依赖注入标准(JSR-330)中定义的注解,它与@Autowired注解类似,也可以用来注入一个依赖的bean。但是,它具有更加严格的规则和更多的选项。例如,它可以注入泛型类型的bean、可选的bean等。
使用@Inject注解的方式如下所示:
@Service
public class MyService {@Injectprivate MyDao myDao;// ...
}
在这个例子中,MyService类中的myDao属性将会被注入一个类型为MyDao的bean。如果存在多个符合条件的bean,则会抛出一个异常。
使用构造函数注入
除了使用注解,还可以使用构造函数注入来注入依赖的bean。这种方式通常被认为是更加安全和可读性更高的注入方式。通过构造函数注入,我们可以保证所有必须的依赖都被正确初始化,避免了空指针异常等问题。此外,通过构造函数注入,我们还可以显式地定义bean之间的依赖关系,使得代码更加清晰易懂。
使用构造函数注入的方式如下所示:
@Service
public class MyService {private MyDao myDao;public MyService(MyDao myDao) {this.myDao = myDao;}// ...
}
在这个例子中,MyService类中的myDao属性将会被注入一个类型为MyDao的bean。需要注意的是,这里我们没有使用任任的注解来进行注入,而是通过构造函数的参数来实现注入。这样做可以保证MyService类中的myDao属性在对象创建时被正确初始化。
结语
总结一下,尽管@Autowired注解在Spring中是一个方便的依赖注入方式,但它也有一些缺点。Spring和IDEA都建议使用构造函数注入来提供明确的依赖关系,并避免使用自动注入。除了@Autowired注解之外,我们还可以使用@Resource、@Inject、构造函数注入、Java配置类等方式来注入bean。每种方式都有其优缺点和适用场景。因此,在选择注入方式时,应该根据具体情况选择最合适的方式。
\
相关文章:
为什么Spring和IDEA不推荐使用@Autowired注解?
在Spring开发中,Autowired注解是一个常用的依赖注入方式。但是,你可能会惊奇地发现,Spring和IDEA都不推荐使用Autowired注解。关于这个问题,其实答案相对统一,实际上用大白话说起来也容易理解。 官方答案 首先&#…...
windows下运行dpdk下的helloworld
打开“本地安全策略”管理单元,在搜索框输入secpol。 打开本地策略->用户权限分配->锁定内存页->添加用户或组->高级->立即查找 输入电脑用户名,选择并添加。点击确定后,重启电脑。 安装内核驱动,下载地址https://download.csdn.net/download/qq_36314864…...
【AI理论学习】深入理解Prompt Learning和Prompt Tuning
深入理解Prompt Learning和Prompt Tuning 背景Prompt Learning简介1. Prompt是什么?2. 为什么要使用Prompt?3. Prompt Learning的形式(举例)4. 有哪些Pre-training language model?5. 常见的Prompt Learning的方法 Pro…...
从Authy中导出账户和secret
本文转载于我的博客从Authy中导出账户和secret 前言 因为最近买了CanoKey,所以多算试一下CanoKey的TOTP功能,但是之前一直用的Authy并且它默认不支持导出功能 在网上找了一些文档,终于在github上找到了一个有效且简单的方法 目前网上大部分…...
图像锐度评分算法,方差,点锐度法,差分法,梯度法
图像锐度评分算法,方差,点锐度法,差分法,梯度法 图像锐度评分是用来描述图像清晰度的一个指标。常见的图像锐度评分算法包括方差法、点锐度法、差分法和梯度法等。 方差法:该方法是通过计算图像像素值的方差来评估图像…...
查询练习:连接查询
准备用于测试连接查询的数据: CREATE DATABASE testJoin;CREATE TABLE person (id INT,name VARCHAR(20),cardId INT );CREATE TABLE card (id INT,name VARCHAR(20) );INSERT INTO card VALUES (1, 饭卡), (2, 建行卡), (3, 农行卡), (4, 工商卡), (5, 邮政卡); S…...
【mmdeploy】【TODO】使用mmdeploy将mmdetection模型转tensorrt
mmdetection转换 文章目录 mmdetection转换mmdetection 自带转换ONNX——无法测试使用mmdeploy(0.6.0)使用mmdeploy转onnx使用mmdeploy直接转tensorRT调试记录 先上结论:作者最后是转tensorrt的小图才成功的,大图一直不行。文章仅作者自我记录使用&#…...
德赛西威上海车展重磅发布Smart Solution 2.0,有哪些革新点?
4月18日,全球瞩目的第二十届上海车展盛大启幕,作为国际领先的移动出行科技公司,德赛西威携智慧出行黑科技产品矩阵亮相,并以“智出行 共创享”为主题,重磅发布最新迭代的智慧出行解决方案——Smart Solution 2.0。 从…...
戴尔服务器是否需要开启cpupower.service
戴尔并不会默认开启cpupower.service,这取决于具体的操作系统和配置。cpupower.service是一个Linux系统服务,用于管理CPU的功耗和性能调节,可以通过调整CPU的频率和电源管理策略来降低能耗和温度。在某些情况下,开启cpupower.serv…...
day02_第一个Java程序
在开发第一个Java程序之前,我们必须对计算机的一些基础知识进行了解。 常用DOS命令 Java语言的初学者,学习一些DOS命令,会非常有帮助。DOS是一个早期的操作系统,现在已经被Windows系统取代,对于我们开发人员…...
【华为OD机试真题 】1011 - 第K个排列 (JAVA C++ Python JS) | 机试题+算法思路+考点+代码解析
文章目录 一、题目🔸题目描述🔸输入输出🔸样例1🔸样例2二、代码参考🔸C++代码🔸Java代码🔸Python代码🔸JS代码作者:KJ.JK🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🍂个人博客首页: KJ.JK 💖系列专栏:...
基于php的校园校园兼职网站的设计与实现
摘要 近年来,信息技术在大学校园中得到了广泛的应用,主要体现在两个方面:一是学校管理系统,包括教务管理、行政管理和分校管理,是我国大学管理和信息传递的主要渠道。二是学生生活服务平台。而随着大学生毕业人数的年…...
django部署
1. 配置服务器 安装django,python等服务–尽量和你的自己的配置相同,一摸一样避免出现问题 2.django项目迁移 sudo scp /home/tarena/django/mysitel root88.77.66.55:/home/root/xxx #然后输入密码3,用uWSGI 替代python manage.py runse…...
OpenCV 图像处理学习手册:1~5
原文:Learning Image Processing with OpenCV 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 计算机视觉 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 当别人说你没有底线的时候,…...
深度学习 - 43.SeNET、Bilinear Interaction 实现特征交叉 By Keras
目录 一.引言 二.SENET Layer 1.简介 2.Keras 实现 2.1 Init Function 2.2 Build Function 2.3 Call Function 2.4 Test Main Function 2.5 完整代码 三.BiLinear Intercation Layer 1.简介 2.Keras 实现 2.1 Init Function 2.2 Build Function 2.3 Call Functi…...
Ceph入门到精通-Cephadm安装Ceph(v17.2.5 Quincy)全网最全版本
Deploy Ceph(v17.2.5 Quincy) cluster to use Cephadm - DevOps - dbaselife Install cephadm Cephadm creates a new Ceph cluster by “bootstrapping” on a single host, expanding the cluster to encompass any additional hosts, and then depl…...
BIOS与POST自检
一、什么是BIOS BIOS是英文"BasicInput-Output System",中文名称就是"基本输入输出系统",是集成在主板上的一个ROM芯片,意思是只读存储器基本输入输出系统。顾名思义,它保存着计算机最重要的基本输入输出的程…...
交友项目【查询好友动态,查询推荐动态】实现
目录 1:圈子 1.1:查询好友动态 1.1.1:接口分析 1.1.2:流程分析 1.1.2:代码实现 1.2:查询推荐动态 1.2.1:接口分析 1.2.2:流程分析 1.2.3:代码实现 1:…...
24个强大的HTML属性,建议每位前端工程师都应该掌握!
HTML属性非常多,除了一些基础属性外,还有许多有用的特别强大的属性 本文将介绍24个强大的HTML属性,可以使您的网站更具有动态性和交互性,让用户感到更加舒适和愉悦。 让我们一起来探索这24个强大的HTML属性吧! 1、Acc…...
前端--移动端布局--2移动开发之flex布局
目标: 能够说出flex盒子的布局原理 能够使用flex布局的常用属性 能够独立完成携程移动端首页案例 目录: flex布局体验 flex布局原理 flex布局父项常见属性 flex布局子项常见属性 写出网首页案例制作 1.flex布局体验 1.1传统布局与flex布局 传…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
MySQL体系架构解析(三):MySQL目录与启动配置全解析
MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录,这个目录下存放着许多可执行文件。与其他系统的可执行文件类似,这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中,用…...
