为什么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布局 传…...
基于计算机视觉与物联网的智能虫害监测系统设计与实践
1. 项目概述:从“人眼巡查”到“智能感知”的虫害管理革命在农业种植、仓储物流乃至城市绿化管理中,虫害监测一直是一项耗时耗力且高度依赖经验的工作。传统的做法是依靠人工定期巡查,不仅效率低下,覆盖面有限,而且对巡…...
为什么越来越多公司坚持做背调?
很多中小企业都有一个误区:觉得背调“可有可无”、浪费时间、增加成本。但真实职场现状是:不做背调,才是企业最大的隐形成本。现在求职简历美化早已是常态,履历注水、项目造假、隐瞒纠纷、失信记录……肉眼面试根本看不出来。一次…...
2026 AI搜索迭代下的获客革新:SEOGEO双引擎战略落地实战方案
2026 AI搜索迭代下的获客革新:SEO&GEO双引擎战略落地实战方案摘要:2026年生成式AI全面渗透搜索场景,传统关键词SEO流量遭遇结构性下滑,零点击搜索成为行业常态。本文以泉州本地中小企业数字化服务场景为依托,深度剖…...
linux学习笔记之linux文件管理
#文件系统及Shell的基本概念#文件及目录操作命令#VI的使用#软件包的管理一、文件系统及Shell的基本概念 1.文件系统的含义文件系统是用来管理和组织保存在磁盘驱动器上数据的系统软件 2.Linux的文件系统Linux系统采用虚拟文件系统技术(VFS&am…...
Paramiko vs. Fabric vs. Ansible:Python自动化运维三剑客,我该选哪个?
Paramiko vs. Fabric vs. Ansible:Python自动化运维三剑客深度对比 当服务器数量从个位数增长到三位数时,手工登录每台机器执行命令的效率瓶颈就会暴露无遗。作为Python技术栈的团队,我们通常会在Paramiko、Fabric和Ansible这三个工具中做出选…...
量子电路优化:GSI方法在NISQ时代的应用
1. 量子电路优化的核心挑战与创新思路在当前的NISQ(Noisy Intermediate-Scale Quantum)时代,量子计算机面临着几个关键瓶颈:量子比特的相干时间有限、门操作存在误差、以及量子比特之间的连接受限。这些硬件限制使得量子电路的深度…...
如何重新定义华硕笔记本性能管理:探索G-Helper的轻量化解决方案
如何重新定义华硕笔记本性能管理:探索G-Helper的轻量化解决方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Ze…...
GitLab CVE-2025-1477:URI编码绕过身份验证的应急防护指南
1. 这个漏洞不是“修个补丁就完事”的普通问题GitLab 安全漏洞 CVE-2025-1477,光看编号容易误以为是又一个常规的权限绕过或信息泄露类CVE——毕竟GitLab每年披露几十个中低危漏洞,运维同学看到CVE编号第一反应往往是查CVSS评分、翻官方通告、打补丁、走…...
CLIP原理与实战:零样本图文理解的范式革命
1. 项目概述:为什么CLIP不是又一个“多模态模型”,而是彻底改写图文理解游戏规则的底层工具你可能已经见过太多标榜“图文理解”“跨模态检索”的模型,但真正让从业者在2021年集体停下手头工作、反复刷新arXiv页面的,只有CLIP。它…...
Sora 2提示词失效真相大起底(92%用户踩中的3类语义断层陷阱)
更多请点击: https://kaifayun.com 第一章:Sora 2提示词失效的底层归因与认知重构 Sora 2提示词失效并非表层的语法错误或格式偏差,而是源于其多模态对齐机制中语义解码器与时空生成器之间的结构性错配。当用户输入“雨夜东京涩谷十字路口&a…...
