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

news2024/11/30 20:28:56

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 {
    @Resource
    private 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.coloradmin.cn/o/1159371.html

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

相关文章

使用Fiddler进行Mock测试

1、接口抓包 找到要mock的接口,打开fiddler抓包 以某某接口为例,找到下面的接口 http://XXX/SYSTEMS 2、复制该接口数据到本地 在接口上进行右键点击,选择save -> …and Open as Local File -> 默认会保存至桌面,示例中的数…

文件详细操作过程(C语言)

🌞🌞🌞千淘万漉虽辛苦🌞🌞🌞 🌞🌞🌞吹尽狂沙始到金🌞🌞🌞 🌇C语言文件操作 🍊文件的定义🍋什么是文…

YOLOv5优化:独家创新(Partial_C_Detect)检测头结构创新,实现涨点 | 检测头新颖创新系列

💡💡💡本文独家改进:独家创新(Partial_C_Detect)检测头结构创新,适合科研创新度十足,强烈推荐 SC_C_Detect | 亲测在多个数据集能够实现大幅涨点 ​​​​​​​ 💡💡💡Yolov5/Yolov7魔术师,独家首发创新(原创),适用于Yolov5、Yolov7、Yolov8等各个Y…

python写一个敲木鱼加功德(加音效和敲击动作)

界面展示及视频演示 1、先做一个基本界面 import tkinter from PIL import Image, ImageTk # pip install pillow# 界面 toptkinter.Tk() top.title(敲木鱼加功德) top.geometry(410x400) top.configure(bgblack)# 准备图片 qiaomuyutupianImageTk.PhotoImage(file敲木鱼.jpg)…

ElasticSearch搜索技术深入与聚合查询实战

ES分词器详解 基本概念 分词器官方称之为文本分析器,顾名思义,是对文本进行分析处理的一种手段,基本处理逻辑为按照预先制定的分词规则,把原始文档分割成若干更小粒度的词项,粒度大小取决于分词器规则。 分词发生时…

150行代码实现一个极简的Canvas多功能画板

目录 1.前言2.多功能画板的实现2.1 画板初始化2.2 画笔2.3 橡皮擦2.4 清屏2.5 前进和后退 3.小结 1.前言 HTML5提供的Canvas标签能实现很多有趣的效果,本文就来分享一下如何使用Canvas来实现一个极简的多功能画板。先来看效果: 主要实现以下功能&…

如何制作一款资源网站app

简介 平时生活学习中我们会经常登录各种网站,比如看电影,看视频学习,找资料等等。有时想找到一个靠谱的网站,花了很长时间也找不到。我自己收集了很多好的网站,主要是找资源的,然后我做了一个导航app软件&…

webpack 高级

高级配置就是要进行 webpack 优化,让代码在编译、运行时性能更好 主要从以下角度去优化: 1、提升开发体验 2、提升打包构建速度 3、减少代码体积 4、优化代码运行性能 一、提升体验 1、SourceMap 为什么 打包出来的所有css和js合并成了一个文件&#…

虚拟机部署与发布J2EE项目(Linux版本)

🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 越努力 ,越幸运。 1.jdk安装配置 打开虚拟机 Centos 登入账号,并且使用MobaXterm进行连接 1.1. 传入资源 连接…

【算法专题】双指针—盛最多水的容器

一、题目解析 分析这个题目不难得出一个容积公式 二、算法原理 解法一:暴力枚举(超时) 套用上述的容积公式,使用两个for循环来枚举出所有可能的情况,再挑出最大值即可,但是这种写法会超时,导致…

React使用富文本CKEditor 5,上传图片并可设置大小

上传图片 基础使用(标题、粗体、斜体、超链接、缩进段落、有序无序、上传图片) 官网查看:https://ckeditor.com/docs/ckeditor5/latest/installation/integrations/react.html 安装依赖 npm install --save ckeditor/ckeditor5-react cked…

【C++类和对象:解锁面向对象编程的奇妙世界】

【本节目标】 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 5.类的作用域 6.类的实例化 7.类的对象大小的计算 8.类成员函数的this指针 1.面向过程和面向对象初步认识 C语言是面向过程的,关注的是过程,分析出求…

Nginx搭载负载均衡及前端项目部署

目录 ​编辑 一.Nginx安装 1.安装所需依赖 2.下载并解压Nginx安装包 3.安装nginx 4.启动Nginx服务 二.Tomcat负载均衡 1.准备环境 1.1 准备两个Tomcat 1.2 修改端口号 1.3 配置Nginx服务器集群 2.效果展示 ​编辑三.前端项目打包 ​编辑四.前端项目部署 1.上传项目…

你还不会下载网页上的视频嘛???(超级简单!!)

小伙伴们大家好,废话不多说,直接上干货: F12进入开发者页面 然后F5刷新一下 右键,在新的页面打开 就会看到一个单独的视频网页,右键另存为就好啦

Redis入门02-基础概念

目录 常用的简单操作命令 Redis字符串中的SDS Redis事务 Key的过期时间 Redis实现缓存简单示例 常用的简单操作命令 Redis提供了多种数据类型,包括字符串(String)、哈希(Hash)、列表(List&#xff09…

Spring系列之基础

目录 Spring概述 Spring的优点 Spring Framework的组成 总结 Spring概述 Spring 是目前主流的 Java Web 开发框架,是 Java 世界最为成功的框架。该框架是一个轻量级的开源框架,具有很高的凝聚力和吸引力。它以Ioc(控制反转)和…

GAMP源码阅读:RINEX文件读取

原始 Markdown文档、Visio流程图、XMind思维导图见:https://github.com/LiZhengXiao99/Navigation-Learning 文章目录 1、readobsnav():Rinex 文件读取主入口函数2、readrnxfile():传入文件路径,读取起止时间内数据4、readrnxfp()…

“原生感”暴涨311%,这届年轻人不再爱浓妆?丨小红书数据分析

近年来,越来越多美妆博主在社交媒体平台安利“原生感妆容”,即我们所熟知的“伪素颜妆”、“裸妆”、“白开水妆”,显然,追求“原生感”成为当代妆容主流。通过小红书数据分析工具,查看#原生感妆容 话题,近…

一位69岁美国老程序员的自述:使用Delphi开发了一款软件仅仅销售了半年赚够钱就退休了

我不确定谁会感兴趣,但你是点击按钮的那个人......所以我就说了。 我是一名 69 岁(截至 2008 年)的退休程序员(译者注:Delphi社区的一位网友说本文主人公已经在前几年去世,但是主人公的网站依然还能访问Del…

Mojo::UserAgent模块做的一个快速爬虫项目

use Mojo::UserAgent;my $ua Mojo::UserAgent->new; my $proxy duoip:8000;# 使用爬虫IP $ua->proxy(http, $proxy) # 设置http爬虫IP->proxy(https, $proxy); # 设置https爬虫IPmy $res $ua->get(音乐网址); if ($res->is_success) {print $res->body; …