Spring Boot进阶(57):Spring中什么时候不要用@Autowired注入 | 超级详细,建议收藏

news2024/11/28 8:45:23

 1. 前言🔥

        注解@Autowired,相信对于我们Java开发者而言并不陌生吧,在SpringBoot或SpringCloud框架中使用那是非常的广泛。但是当我们使用IDEA编辑器开发代码的时候,经常会发现@Autowired 注解下面提示小黄线警告,我们把小鼠标悬停在注解上面,可以看到这个如下图所示的警告信息:

         这段警告是啥意思?为什么idea会给出 Field injection is not recommended 这样的警告呢?下面带着这些问题,一起来全面的了解下Spring中的三种注入方式以及他们之间在各方面的优劣。这将又会是干货满满的一期,全程无尿点不废话只抓重点教,具有非常好的学习效果,拿好小板凳准备就坐!希望学习的过程中大家认真听好好学,学习的途中有任何不清楚或疑问的地方皆可评论区留言或私信,bug菌将第一时间给予解惑,那么废话不多说,直接开整!Fighting!! 

2. 环境说明🔥

本地的开发环境:

  • 开发工具:IDEA 2021.3
  • JDK版本: JDK 1.8
  • Spring Boot版本:2.3.1 RELEASE
  • Maven版本:3.8.2

3. 三种注入方式🔥 

        我先给大家介绍一下Spring中的三种依赖注入方式,分别是Field Injection、Constructor Injection 和 Setter Injection,如下我分别进行重点介绍,同学们请看:

3.1 Field Injection

首先, @Autowired注解的一大使用场景非Field Injection莫属,具体代码演示如下:

@RestController
@RequestMapping("/user")
@Api(tags = "用户管理模块", description = "用户管理模块")
public class UserController {

    @Autowired
    private UserService userService;
    @Autowired
    private UserMapper userMapper;

}

解读:这种注入方式通过Java的反射机制进行实现,所以private的成员也可以被注入具体的对象。

3.2 Constructor Injection 

Constructor Injection :构造器注入。Constructor Injection而言,是我们日常最为推荐的一种使用方式,具体代码演示如下:

@RestController
@RequestMapping("/user")
@Api(tags = "用户管理模块", description = "用户管理模块")
public class UserController {

    @Autowired
    private UserMapper userMapper;

    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

}

解读:这种注入方式很直接,通过对象构建的时候就把关系建立好,所以这种注入方式对对象创建的顺序会有要求,当然Spring会为你解决你的这种先后顺序的顾虑,除非你出现循环依赖问题,否则是不会抛出异常的。 

3.3 Setter Injection

        Setter Injection:成员变量的Setter函数上。其注入方式也会用到@Autowired注解,但使用方式与Field Injection是有所不同的,Field Injection是用在成员变量上,而使用Setter Injection方式注入是用在成员变量的Setter函数上。具体代码演示如下:

@RestController
@RequestMapping("/user")
@Api(tags = "用户管理模块", description = "用户管理模块")
public class UserController {

    private UserService userService;

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    @Autowired
    private UserMapper userMapper;
}

解读:这种注入方式相比上面两种也很好理解,就是通过调用成员变量的set方法来注入想要使用的依赖对象,其他的都一样。

4. 三种依赖注入对比🔥

        经上文介绍,我们已在知道了Spring提供的三种依赖注入方式,但本文开头所抛出的问题:IDEA为什么不推荐Field Injection使用呢?为什么?

        这里我们可以从多个开发测试的考察角度来对比一下它们之间的优劣:

4.1 可靠性

主要从对象构建过程和使用过程中来衡量,看对象在各阶段的使用是否可靠作为依据进行分析:

  1. Field Injection:不可靠
  2. Constructor Injection:可靠
  3. Setter Injection:不可靠

由于构造函数有严格的构建顺序和不可变性,一旦构建就可用且不会被更改。

4.2 可维护性

主要从更容易阅读、分析依赖关系的角度作为依据进行分析:

  • Field Injection:差
  • Constructor Injection:好
  • Setter Injection:差

还是由于依赖关键的明确,从构造函数中可以显现的分析出依赖关系,对于我们如何去读懂关系和维护关系等更友好更浅显易懂。

4.3 可测试性

可测试性在复杂依赖关系的情况下,考察程序是否更容易编写单元测试作为依据进行分析:

  • Field Injection:差
  • Constructor Injection:好
  • Setter Injection:好

Constructor Injection和Setter Injection 的方式更容易Mock和注入对象,所以更容易开发者进行单元测试开发。

4.4 灵活性

灵活性主要根据开发实现时候的编码灵活性来判断:

  • Field Injection:好
  • Constructor Injection:差
  • Setter Injection:好

由于Constructor Injection对Bean的依赖关系设计有严格的顺序要求,所以这种注入方式不太灵活。相反 Field Injection 和 Setter Injection 这种方式使用起来就非常灵活,但由于其灵活带来了局面的混乱,也是一把双刃剑。

4.5 循环关系的检测

对于Bean之间是否存在循环依赖关系的检测能力,统计分析如下:

  • Field Injection:不检测
  • Constructor Injection:自动检测
  • Setter Injection:不检测

4.6 性能表现

不同的注入方式,对性能的影响分析如下:

  • Field Injection:启动快
  • Constructor Injection:启动慢
  • Setter Injection:启动快

性能上主要影响的就是启动时间,由于 Constructor Injection 有严格的顺序要求,所以会把启动时间拉长,这也是它的弊端之一。

4.7 总结

所以,综合上面各方面的比较,可以获得如下表格:

三种依赖注入的对比

最后,对于今天的问题的抛出,主要分析出两个结论,总结如下:

  1. 依赖注入的使用上Constructor Injection 是首选。
  2. 使用@Autowired注解的时候,要使用Setter Injection方式,这样代码更容易编写单元测试。

        好了,今天的学习就到这里!如果您学习过程中如遇困难?可以购买我们超高质量的专栏《滚雪球学Spring Boot》参与入门体验,更好的学习与进步!

5. 热文推荐🔥

滴~如下推荐【Spring Boot 进阶篇】的学习大纲,请小伙伴们注意查收。

Spring Boot进阶(01):Spring Boot 集成 Redis,实现缓存自由

Spring Boot进阶(02):使用Validation进行参数校验

Spring Boot进阶(03):如何使用MyBatis-Plus实现字段的自动填充

Spring Boot进阶(04):如何使用MyBatis-Plus快速实现自定义sql分页

Spring Boot进阶(05):Spring Boot 整合RabbitMq,实现消息队列服务

Spring Boot进阶(06):Windows10系统搭建 RabbitMq Server 服务端

Spring Boot进阶(07):集成EasyPoi,实现Excel/Word的导入导出

Spring Boot进阶(08):集成EasyPoi,实现Excel/Word携带图片导出

Spring Boot进阶(09):集成EasyPoi,实现Excel文件多sheet导入导出

Spring Boot进阶(10):集成EasyPoi,实现Excel模板导出成PDF文件

Spring Boot进阶(11):Spring Boot 如何实现纯文本转成.csv格式文件?

Spring Boot进阶(12):Spring Boot 如何获取Excel sheet页的数量?

Spring Boot进阶(13):Spring Boot 如何获取@ApiModelProperty(value = “序列号“, name = “uuid“)中的value值name值?

Spring Boot进阶(14):Spring Boot 如何手动连接库并获取指定表结构?一文教会你

Spring Boot进阶(15):根据数据库连接信息指定分页查询表结构信息

Spring Boot进阶(16):Spring Boot 如何通过Redis实现手机号验证码功能?

Spring Boot进阶(17):Spring Boot如何在swagger2中配置header请求头等参数信息

Spring Boot进阶(18):SpringBoot如何使用@Scheduled创建定时任务?

Spring Boot进阶(19):Spring Boot 整合ElasticSearch

Spring Boot进阶(20):配置Jetty容器

Spring Boot进阶(21):配置Undertow容器

Spring Boot进阶(22):Tomcat与Undertow容器性能对比分析

Spring Boot进阶(23):实现文件上传

Spring Boot进阶(24):如何快速实现多文件上传?

Spring Boot进阶(25):文件上传的单元测试怎么写?

Spring Boot进阶(26):Mybatis 中 resultType、resultMap详解及实战教学

Spring Boot进阶(27):Spring Boot 整合 kafka(环境搭建+演示)

Spring Boot进阶(28):Jar包Linux后台启动部署及滚动日志查看,日志输出至实体文件保存

Spring Boot进阶(29):如何正确使用@PathVariable,@RequestParam、@RequestBody等注解?不会我教你,结合Postman演示

Spring Boot进阶(30):@RestController和@Controller 注解使用区别,实战演示

...

6. 文末🔥

        如果想系统性的学习Spring Boot,小伙伴们直接订阅bug菌专门为大家创建的Spring Boot专栏《滚雪球学Spring Boot》从入门到精通,从无到有,从零到一!以知识点+实例+项目的学习模式由浅入深对Spring Boot框架进行学习&使用。

        如果你有一定的基础却又想精进Spring Boot,那么《Spring Boot进阶实战》将会是你的最好的选择;此栏进行知识点+实例+项目的学习方式全面深入框架剖析及各种高阶玩法,励志打造全网最全最新springboot学习专栏,投资学习自己性价比最高。

        本文涉及所有源代码,均已上传至github开源,供同学们一对一参考,GitHub,同时,原创开源不易,欢迎给个star🌟,想体验下被加Star的感jio,非常感谢 ❗

       我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!

关注公众号,获取最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等硬核资源

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

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

相关文章

Unity 任意数据在Scene窗口Debug

任意数据在Scene窗口Debug 🍔效果🥪食用方法 🍔效果 如下所示可以很方便的把需要Debug的数据绘制到Scene中(普通的Editor脚本只能够对MonoBehaviour进行Debug) 🥪食用方法 💡. 新建脚本继承Z…

127.0.0.1/linux常用dos命令

ls 命令 LS 命令用于查看目录的内容。默认情况下,此命令将显示当前工作目录的内容。如果要查看其他目录的内容,请键入 ls,然后键入目录的路径。例如,输入 LS / 家 / 用户名 / 文档查看的内容的文件。 ls命令是文件列表命令&#…

Cisco学习笔记(CCNA)——IP Subnetting

IP Subnetting 目录 IP地址 数制的计算 IP地址的分类 特殊IPv4地址 IP地址的组成 子网掩码 IPv4网络中的地址类型 划分子网 ​编辑CIDR IP地址 网络层概念 主机唯一的标识,保证主机间正常通信 一种网络编码,用来确定网络中一个节点 IP地址…

运维:Centos7安装解压版mysql5.7

目录 1、卸载Centos7默认自带的mariadb数据库,避免冲突 2、下载解压版mysql并安装 3、配置mysql 4、mysql客户端访问 MySQL 是一种开源的关系型数据库管理系统(RDBMS),它具有许多优点和一些缺点。以下是 MySQL 的主要优缺点&am…

【C语言+sqlite3 API接口】实现水果超市

实验内容: 假如我家开了个水果超市,有以下水果,想实现自动化管理,扫描二维码就能知道当前的水果状态,进货几天了, 好久需要再次进货,那些水果畅销,那些水果不畅销,那些水…

Python 算法基础篇:深度优先搜索( DFS )和广度优先搜索( BFS )

Python 算法基础篇:深度优先搜索( DFS )和广度优先搜索( BFS ) 引言 1. 深度优先搜索( DFS )算法概述2. 深度优先搜索( DFS )算法实现实例1:图的 DFS 遍历实例…

理性对道德的作用是很小的

从某种程度上说,理性对道德的作用是很重要的。理性能够帮助我们思考和评估道德问题,并提供合理的解决方案。它使我们能够运用逻辑和推理能力来分析情况,权衡利益和后果,并做出更明智的决策。 理性有助于我们超越个人感受或冲动&am…

如何在医疗器械行业运用IPD?

医疗器械是指单独或者组合使用于人体的仪器、设备、器具、材料或其他物品,包括所需要的软件。按安全性可分为低风险器械、中风险器械和高风险器械。其中低风险器械大都属于低值耗材,其中包括绷带、纱布、海绵、消毒液等;中度风险器械类包括体…

结构型模式 - 适配器模式

概述 如果去欧洲国家去旅游的话,他们的插座如下图最左边,是欧洲标准。而我们使用的插头如下图最右边的。因此我们的笔记本电脑,手机在当地不能直接充电。所以就需要一个插座转换器,转换器第1面插入当地的插座,第2面供…

linux之Ubuntu系列(五)用户管理 终端命令 su 切换用户

# 切换用户 zenxx:su - sup # 录入sup 密码 supxx:$ 切换root用户

增强匿名性:了解 HTTP 代理的作用

当你在浏览网页时,你的个人信息和上网痕迹都是暴露在公共网络之中的,任何人都可以轻松地获取到这些信息。而这种信息泄露不仅会威胁你的个人隐私,还会对你的网络安全带来潜在的风险。为了解决这个问题,HTTP代理应运而生。 而 IPR…

v-model指令获取常见表单项的内容 input,textarea,radio,checkbox,select

v-model指令获取常见表单项的内容 1. v-model 作用和语法2. v-model 获取常见表单项 1. v-model 作用和语法 作用: 给 表单元素 使用, 双向数据绑定 → 可以快速 获取 或 设置 表单元素内容 ① 数据变化 → 视图自动更新 ② 视图变化 → 数据自动更新语法: v-model ‘变量’ …

Day13 01-Linux介绍与安装教程

文章目录 第一章 Linux简介【了解】1.1 Linux的介绍1.2 Linux的两大阵营1.3 CentOS社区版介绍 第二章 Linux的安装【重要】2.1 VMWare&Parallels Desktop的安装2.1.1 VMWare的简介2.1.2 VMWare安装的注意事项2.1.3 Parallels Desktop的简介 2.2 VMWare安装Linux2.2.1 准备事…

UG\NX二次开发 获取工作部件的所有表达式,以及值

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 获取工作部件的所有表达式,以及值。 效果: 代码: #include "me.hpp" #include <iostream> #include <sstream> #include <string> //double转string保留所有小…

Vue找到package.json中没有用到依赖并删除

引言 一切都是由于强迫症&#xff0c;我想把一个Vue项目中没有用到的依赖删除掉。 解决方法 depcheck Depcheck is a tool for analyzing the dependencies in a project to see: how each dependency is used, which dependencies are useless, and which dependencies are…

高德地图实现水流效果

一、源代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>水系图</title><style>…

Pycharm环境配置

Pycharm是一款功能强大的Python开发工具&#xff0c;它可以帮助用户快速搭建Python开发环境。 1. Pycharm 官网下载安装 https://www.jetbrains.com.cn/en-us/pycharm/ 2. 配制项目Pycharm 环境 Pycharm 可以直接创建项目&#xff0c;&#xff08;如果是github下载的文件&a…

数据结构-树的基本概念和堆

树的基本概念和堆 树的基本概念堆的建立堆的信息堆的初始化堆的push&#xff08;数据插入后&#xff0c;仍要遵守堆的规则&#xff09;堆的pop根的元素值堆的大小堆的销毁演示一个过程&#xff0c;打印出该堆的前k个元素全部代码Heap.hHeap.cTest.c 堆的应用&#xff08;排序&a…

Python 下载安装总结

title: Python 下载安装总结 date: 2023-06-26 16:40:45 tags: Python categories:开发工具及环境 cover: https://cover.png feature: false 1. 下载 进入官网&#xff1a;Python.org&#xff0c;鼠标悬停在 Downloads&#xff0c;就会出现下载按钮 点击下载&#xff0c;即可…

番外-sql server数据库表及视图未备份,误删恢复

&#xff08;1&#xff09;关闭sql server服务&#xff0c;防止数据发生更大变化&#xff1b;备份数据库的ldf文件和mdf文件&#xff08;非常重要&#xff09; &#xff08;2&#xff09;安装工具ApexSQLLog &#xff08;3&#xff09;运行工具 首先设置一下数据库连接的方式…