spring 和 idea 建议不要使用 @Autowired注解

spring 和 idea 建议不要使用 @Autowired注解

    • 一. 问题描述
    • 二. 警告原因和如何去除
    • 三. 个人的收获和解决方案
      • 3. 1 个人感受
      • 3.2 通过构造函数解决警告问题
    • 四. 小知识
      • 4.1 使用@Autowired还会出现循环依赖的问题么
      • 4.2 @Autowired 和 @Resource区别

前言

这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱

一. 问题描述

公司项目闲下来了之后,我就开始整理之前写过的代码,发现每个Autowired下面都有警告,**Field injection is not recommended(不建议使用字段注入)**这是什么意思呢?

请添加图片描述

二. 警告原因和如何去除

百度了一圈,以下是我总结的问题答案

虽然 @Autowired 是 Spring Boot 中最常用的依赖注入方式之一,但是在实际开发中,建议尽量避免使用 @Autowired,而是使用构造函数注入或者 @Resource 注解注入。

以下是使用 @Autowired 存在的一些问题:

  1. 不够明确:在使用 @Autowired 进行依赖注入时,Spring 会自动根据类型来匹配 Bean,如果存在多个类型相同的 Bean,就会产生歧义。此时,需要使用 @Qualifier 注解或者 @Primary 注解来指定具体的 Bean。但是,这种方式不够明确,容易出现错误。

  2. 难以测试:使用 @Autowired 进行依赖注入时,需要在测试中手动创建 Bean,并将其注入到测试类中。这种方式比较麻烦,而且容易出现错误。

  3. 无法保证依赖注入的顺序:在使用 @Autowired 进行依赖注入时,Spring 会根据 Bean 的创建顺序来注入依赖,这种方式无法保证依赖注入的顺序。

因此,在实际开发中,建议使用构造函数注入或者 @Resource 注解注入。这种方式更加明确、易于测试,并且可以保证依赖注入的顺序,所以idea不建议使用Autowired注入了。

例如,使用构造函数注入的方式可以这样写:

@Service
public class UserService {private final UserRepository userRepository;public UserService(UserRepository userRepository) {this.userRepository = userRepository;}// ...
}

或者使用 @Resource 注解注入的方式可以这样写:

@Service
public class UserService {@Resourceprivate UserRepository userRepository;// ...
}

这些方式都可以避免使用 @Autowired 带来的警告问题。

三. 个人的收获和解决方案

3. 1 个人感受

参考了很多个文章之后,我不在使用autowired对我来说使用autowired最大的问题是会写出很多个循环依赖出来,虽然Spring 使用了三级缓存来处理循环依赖,项目也能够正常运行,但是这样会导致很多循环依赖问题我们发现不了,写出很多不规范的代码。每个模块之间应该是分层的,每个模块、类或方法应该只负责一个明确的功能或任务,遵循单一职责

像以下循环依赖的报错,使用autowired就能够解决

请添加图片描述

以上是我的收获,不知道有没有理解错误的地方,希望大家指出

3.2 通过构造函数解决警告问题

为了消除警告,避免写出循环依赖的代码,我就使用了构造函数注入,以下是我项目中使用的方式,通过@RequiredArgsConstructor可以减少很多代码

@RequiredArgsConstructor是Lombok框架中的注解之一,用于自动生成一个包含所有必需参数的构造函数。它可以帮助开发人员减少代码量,避免手动编写构造函数。使用@RequiredArgsConstructor注解时,Lombok会自动检测类中所有被声明为final的字段,并将其作为构造函数的参数。生成的构造函数将使用这些参数来初始化字段。

例如,下面是一个使用@RequiredArgsConstructor注解:

@RequiredArgsConstructor
public class MyService {private final MyRepository myRepository;private final MyLogger myLogger;// ...
}

@RequiredArgsConstructor注解会自动生成一个构造函数,该构造函数包含两个参数:myRepositorymyLogger。这两个参数都是被声明为final的字段,因此它们将被用于初始化相应的字段。

生成的构造函数等效于以下代码:

public class MyService {private final MyRepository myRepository;private final MyLogger myLogger;public MyService(MyRepository myRepository, MyLogger myLogger) {this.myRepository = myRepository;this.myLogger = myLogger;}// ...
}

使用@RequiredArgsConstructor注解可以让开发人员更快地编写代码,并避免手动编写构造函数。将字段声明为final,以确保不可变性和线程安全性。

四. 小知识

4.1 使用@Autowired还会出现循环依赖的问题么

使用 @Autowired 仍然可能会出现循环依赖的问题。

Spring 容器在初始化时会先实例化所有的 bean,然后再进行依赖注入。如果 A bean 依赖了 B bean,而 B bean 又依赖了 A bean,就会出现循环依赖的问题。为了解决这个问题,Spring 使用了三级缓存来处理循环依赖。当容器在初始化 A bean 时,如果发现它依赖了 B bean,就会先创建一个 A bean 的代理对象,然后将代理对象放入第一级缓存中。接着容器会创建 B bean,并将其注入到 A bean 的代理对象中。最后再将 A bean 的代理对象注入到 B bean 中。但是,如果循环依赖的链条过长,就有可能导致 Spring 容器无法解决循环依赖的问题,此时就会抛出 BeanCurrentlyInCreationException 异常。因此,在使用 @Autowired 进行依赖注入时,需要注意避免出现循环依赖的情况。

4.2 @Autowired 和 @Resource区别

  • @Autowired 是 Spring 框架的注解,而 @Resource 是 JavaEE 的注解。
  • @Autowired 默认按照类型进行匹配,如果有多个同类型的 bean,则可以通过 @Qualifier 指定具体的 bean 名称。而 @Resource 默认按照名称进行匹配,如果名称匹配不到,则可以通过 name 属性指定具体的 bean 名称。
  • @Autowired 可以用在构造方法、setter 方法、字段上,而 @Resource 只能用在字段上。
  • @Autowired 是 Spring 框架的特有功能,而 @Resource 是 JavaEE 的标准功能,在使用时需要注意兼容性问题。
  • 都可以用于依赖注入

作者:神的孩子都在歌唱
本人博客:https://blog.csdn.net/weixin_46654114
转载说明:务必注明来源,附带本人博客连接。

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

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

相关文章

vivo 自研蓝河操作系统 BlueOS 发布:支持大模型、BlueXlink 协议实现万物互联

大家好,我是 Lorin , 2023 年 11 月 1 日,在今天的 2023 年 vivo 开发者大会上,vivo 自主研发的蓝河操作系统(BlueOS)正式亮相。这款操作系统被宣传为一款面向未来的智能操作系统,具备出色的支持能力&#…

PlantSimulation访问本地Excel文件的方法

PlantSimulation访问本地Excel文件的方法 PlantSimulation访问本地Excel文件的方法PlantSimulation访问本地Excel文件的方法 //Param StatusTable,T_DataTable:object var T_DataTable:object:=DataTable IF NOT isComputerAccessPermittedMESSageBox("计算机访问被阻止,…

maven:编译出现Process terminated解决方法(超全)

maven:编译出现Process terminated解决方法(超全) 一. 情况一:配置文件 settings. xml 出错(解决方法1)1.1 项目编译报错如下:1.2 点击【项目名】提示找到出错文件1.3 点击查看出错文件1.4 原因及解决办法 …

大模型推理最新论文及源码合集,涵盖多模态推理、逻辑推理、数学推理

大模型推理技术的发展帮我们解决了许多的难题,但如今的大模型在复杂推理上的表现仍然欠佳,为了突破这一瓶颈,研究者们提出了许多创新性的方法。 我整理了其中一部分个人认为很值得学习的论文来和大家分享,涵盖多模态推理、逻辑推…

Agent 应用于提示工程

如果Agent模仿了人类在现实世界中的操作方式,那么,能否应用于提示工程即Prompt Engingeering 呢? 从LLM到Prompt Engineering 大型语言模型(LLM)是一种基于Transformer的模型,已经在一个巨大的语料库或文本数据集上进行了训练&…

品牌加盟商做信息展示预约小程序的效果如何

很多行业都有中部或头部品牌,对实体品牌企业来说想要快速高效发展,除了多地直营店外还需要招募加盟商进而提升生意营收。 因此线上渠道变得尤为重要,除了网站外,小程序是连接多平台生态很好的工具,随时打开、直接触达…

python hashlib模块及实例

hashlib 模块密码加密密码撞库密码加盐 一,hashlib模块 hashlib模块是用来为字符串进行加密的模块,通过该作用就可以为用户的密码进行加密。 通过模块中的hash算法可以为任意长度的字符串加密成长度相同的一串hash值。该hash算法得到的hash值有一下几个…

HNU-数据库系统-讨论课1

第一次小班讨论课安排如下: 主题: 大数据管理及前沿技术讨论 目的:让学生了解大数据管理的相关理论、技术和系统。 内容: (1)大数据概念、应用、技术的相关知识。 (2)AI4DB (3)DB4AI &…

vue中electron与vue通信(fs.existsSync is not a function解决方案)

electron向vue发送消息 dist/main.js (整个文件配置在另一条博客里) win new BrowserWindow({width:1920,height:1080,webPreferences: {// 是否启用Node integrationnodeIntegration: true, // Electron 5.0.0 版本之后它将被默认false// 是否在独立 JavaScript 环境中运行…

【强化学习】13 —— Actor-Critic 算法

文章目录 REINFORCE 存在的问题Actor-CriticA2C: Advantageous Actor-Critic代码实践结果 参考 REINFORCE 存在的问题 基于片段式数据的任务 通常情况下,任务需要有终止状态,REINFORCE才能直接计算累计折扣奖励 低数据利用效率 实际中&#…

react条件渲染

目录 前言 1. 使用if语句 2. 使用三元表达式 3. 使用逻辑与操作符 列表渲染 最佳实践和注意事项 1. 使用合适的条件判断 2. 提取重复的逻辑 3. 使用适当的key属性 总结 前言 在React中,条件渲染指的是根据某个条件来决定是否渲染特定的组件或元素。这在构…

KanTts最小安装-ubuntu

为什么选它? 克隆有很多,为什么选它,它是中国人做的,阿里达摩院,5分钟音频数据集就够了。 国内做的有什么好处,因为大家都是中国人,说的是中国话,技术最大的难题不是基础&#xff…

2023年【道路运输企业主要负责人】考试技巧及道路运输企业主要负责人复审模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 2023年【道路运输企业主要负责人】考试技巧及道路运输企业主要负责人复审模拟考试,包含道路运输企业主要负责人考试技巧答案和解析及道路运输企业主要负责人复审模拟考试练习。安全生产模拟考试一点通结合…

前端JavaScript

文章目录 一、JavaScript概述JS简介1.ECMAScript和JavaScript的关系2.ECMAScript的历史3.什么是javas?4.JavaScript的作用? 三者之间的作用JS基础1.注释语法2.引入js的多种方式3.结束符号 变量与常量变量1.JavaScript声明2.var与let的区别常量 基本数据类…

Mysql系列 -索引模型数据结构

索引就是排好序的数据结构,可以帮助我们快速的查找到数据,那么底层的数据到底是如何存储的呢? 为什么InnoDB 用的是Btree 存储结构? 大家可以看看这个可视化的网站 数据结构和算法的可视化工具 可以看到数据结构里面有链表&…

如何确认目标期刊被SCI或EI收录?

原创内容,仅供参考,欢迎大家批评指正! 目录 通过Web of Science查询SCI期刊1. 登录Web of Science2. 查找目标期刊3. 查看期刊信息 通过Scopus查询EI期刊1. 登录Scopus2. 查找目标期刊3. 查看期刊信息 参考 通过Web of Science查询SCI期刊 1…

学习c++的第二天

目录 数据类型 基本数据类型 typedef 声明 枚举类型 类型转换 变量类型 变量定义 变量声明 左值(Lvalues)和右值(Rvalues) 变量作用域 数据类型 基本数据类型 C 为程序员提供了种类丰富的内置数据类型和用户自定义的数…

相册里的视频怎么提取音频?帮你整理了几个必备的!

有的时候视频中的音频包含重要信息,如对话、旁白、音乐等。提取音频不仅可以节省存储空间,还方便对这些信息进行单独处理和利用。那么如何提取音频呢?下面介绍了3种方法~ 方法一:直接使用手机相册自带功能 1、打开手机相册&#…

C语言重点突破(五) 动态内存管理

前言 动态内存管理是指在一个程序运行期间动态地分配、释放和管理内存空间的过程。在应用程序中,当程序需要使用变量或对象时,需要在内存中分配一段空间,并在使用完毕后释放该空间,以提高程序的效率和性能。本文意在介绍常用动态…

PostGreSQL:JSON|JSONB数据类型

JSON JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)JSON 是轻量级的文本数据交换格式JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许…