为什么Spring和IDEA不推荐使用@Autowired注解?

news2024/9/30 21:36:37

在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 {

    @Inject
    private 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。每种方式都有其优缺点和适用场景。因此,在选择注入方式时,应该根据具体情况选择最合适的方式。

\

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/437841.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用springboot解释什么是jwt

目录 使用springboot解释什么是jwt简介组成结构在springboot中的作用1. 添加依赖 在pom.xml文件中添加以下依赖2. 配置JWT 在Spring Boot的配置文件中配置JWT的相关参数,例如密钥、过期时间等:3. 创建JWT工具类 创建一个JWT工具类,用于生成和…

数据治理体系建设

01 数据治理建设路径 1. 业务数字化的目的是打造一体化的业务流、信息流与数据流 从企业整体经营管理的角度,战略制定及分解—领域业务目标制定—业务方案设计—业务需求识别 & 信息系统功能及数据库设计—数据汇聚及分析—业务目标监测及改善,这个…

Mysql安装详细教程

数据库相关概念 而目前主流的关系型数据库管理系统的市场占有率排名如下: Oracle:大型的收费数据库,Oracle公司产品,价格昂贵。 MySQL:开源免费的中小型数据库,后来Sun公司收购了MySQL,而Oracle…

PEIS体检管理系统源码,自主知识产权,文档齐全,功能完善

PEIS体检管理系统源码,自主知识产权,文档齐全,有演示。 体检条码化管理,体检数据比对,丰富的诊断模板,自动产生小结、综述和建议。 文末获取联系! PEIS体检管理系统对医院体检中心进行系统化和…

java二维数组遍历

在 java中,二维数组是指在二维平面上的一个数组。在二维数组中,数据都是按行排序的。我们通常可以用“从上到下”、“从左到右”、“从后到前”等方法来遍历二维数组。由于二维数组中数据的有序性,我们可以在二维数组中快速地找到我们所需要的…

手机穿戴设备能力共享,提升丰富交互体验

HUAWEI Wear Engine面向手机和穿戴设备的应用与服务开发者,提供华为穿戴设备开放能力。 开发者通过调用Wear Engine开放能力,可以实现手机上的生态应用与服务给华为穿戴设备发消息、发通知、传输数据,并获取穿戴设备状态、读取传感器数据等&…

65W氮化镓(GaN)充电头PD快充方案

2023年数码圈中讨论较多的莫过于65W氮化镓(GaN)充电头。65W快充是目前快充市场出货的主流规格;氮化镓具有高可靠性,能够承受短时间过压;将GaN用于充电器的整流管后,能降低开关损耗和驱动损耗,提…

超清大屏沉浸音效,用极米H6 4K版看剧更有代入感

近日,由张译主演的悬疑剧《他是谁》开播,该剧主要讲述了以卫国平(张译饰)为首的刑警坚持不懈8年追凶,帮受害者讨回公道的故事。《狂飙》作为现象级爆款剧落幕不久,饰演刑警安欣的影帝张译,又在悬疑剧《他是谁》中主演刑…

本地套接字(domain)

本地套接字是一种特殊类型的套接字,和 TCP/UDP 套接字不同。TCP/UDP 即使在本地地址通信,也要走系统网络协议栈,而本地套接字,严格意义上说提供了一种单主机跨进程间调用的手段,减少了协议栈实现的复杂度,效…

consul集群搭建教程

简言 1. 使用consul单节点有宕机,数据丢失的风险,为了安全,使用consul集群更靠谱 2. consul的各个版本下载地址在 Consul Versions | HashiCorp Releases 3. 本文使用consul的版本是consul1.15.1,所以请下载名字为 consul_1.15…

数据密集型应用存储与检索设计

本文内容翻译自《数据密集型应用系统设计》,豆瓣评分高达 9.7 分。 什么是「数据密集型应用系统」? 当数据(数据量、数据复杂度、数据变化速度)是一个应用的主要挑战,那么可以把这个应用称为数据密集型的。与之相对的是…

免费文本转语音(在线文本转语音)

个人开发的网站,已经维护快一年了,接口稳定,基于微软官方接口,可在线生成,手机电脑平板通用。每天提供一定额度(时而5000时而2000时而500,根据服务器压力调整)的免费字数供大家使用。…

数画-AI绘画-免费的人工智能AI绘画网站

文章目录 AIGC什么是AI作画?Prompt数画AIGC的未来发展结语 AIGC AIGC(AI Generated Content)是指利用人工智能生成内容。是利用人工智能来生成你所需要的内容,GC的意思是创作内容。与之相对应的概念中,比较熟知的还有P…

瑞芯微RK3568对比RK3399性能解析

RK3568核心板简介 ​ RK3568核心板是武汉万象奥科基于瑞芯微Rockchip的RK3568设计的一款高性能核心板。它采用四核Cortex-A55架构,最高主频可达2.0GHz,同时集成Mali-G52 2EE GPU,支持4K60fps H.265/H.264/VP9解码和4K60fps H.265/H.264编码…

北大POJ 1000 ~ 1007

1. AB 🍑 POJ1000 ab 🍔 签到题 import java.io.*; import java.util.*; public class Main {public static void main(String args[]) throws Exception{Scanner cinnew Scanner(System.in);int acin.nextInt(),bcin.nextInt();System.out.println(…

【Vue3】Vue项目各个配置文件的相关用途

通过Vue Cli创建好初始代码后,对于各个文件以及配置文件的用途,比较模糊。弄清楚配置文件的大致作用,十分有利于项目整体性的把控,在实际项目中例如修改配色、样式、统一页面结构等,都可以事半功倍。 1、package.json …

分享下这些软件外包公司(2023最新版),程序员有福了

金三银四已经过去一半,再过几个月又将迎来毕业季,大家有没有找到心仪的工作机会呀? 今年找工作的行情确实不行,在网上也能听见很多人在讨论说今年工作实在是太难找了。 如果实在找不到合适的工作,那外包也可以考虑下了…

【LeetCode】102.二叉树的层序遍历

1.问题 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] 示例 2&#xff1a…

Centos7配置静态ip地址

目录 查找配置网络的文件 配置静态ip VMware查找网关ip Windows Mac 查找配置网络的文件 先输入以下命令查看下ip是通过哪个文件来配置的 ip addr 修改网络配置文件(注意看我上面查到的是ens32, 所以在ifcfg-后面拼的是这个) vi /etc/sysco…

VM——下载 centos

进入centos官网 这里显示了我所在地区可用的ISO镜像,这里我选阿里的镜像库 然后选择centos的版本, 【DVD】标准版本 【Everything】集成所有软件版本 【LiveGNOME】GNOME桌面版本 【LiveKDE】KDE桌面版本 【Minimal】最小安装版本 【NetInstall】网…