使用 @Autowired 依赖注入时警告不建议使用字段注入

news2025/1/23 12:01:41

文章目录

    • 字段注入缺点
      • 无法注入 final 字段
      • 与 Spring 容器耦合度高
    • 构造器注入(Spring 官方推荐)
    • Setter 方法注入

在 Spring 中注入依赖时有字段注入构造器注入、Setter 方法注入三种注入方式。

字段注入缺点

无法注入 final 字段

在 Spring 2.5 中引入了 @Autowired 注解,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。在成员变量上使用 @Autowired 注解可以进行字段注入,如下:

public class UserController {
    @Autowired
    private UserService userService;
}

使用起来代码简洁,简单方便,可读性强。但是 Spring 官方不建议使用这种注入方式,在 IDEA 中使用字段注入时会出现黄色波浪线,如下所示:

在这里插入图片描述

@Autowired 的本质是通过反射的方法完成属性注入,因此,@Autowired 会在对象创建完成之后执行,同时@Autowired 也无法在声明为 final 类型的字段上发生作用,否则会报尚未初始化错误:

在这里插入图片描述

因为这些字段必须在类实例化时实例化。

与 Spring 容器耦合度高

其次,使用@Autowired 字段注入会增加与 Spring 容器的耦合程度,例如在测试类中测试 UserControllergetUser() 方法:

@Test
void contextLoads() {
    UserController userController = new UserController();
    userController.getUser();
}

由于在 getUser() 方法中调用了字段注入的 UserService ,所以运行时会报 NullPointerException 空指针异常:

在这里插入图片描述

修改为使用 Spring 容器注入依赖后解决:

@Autowired
private UserController userController;

@Test
void contextLoads() {
    userController.getUser();
}

构造器注入(Spring 官方推荐)

在类构造器上使用 @Autowired 注解,在构造器中将对象注入 final 类型的字段,同时避免了出现空指针异常。

public class UserController {
    private final UserService userService;
    @Autowired
    public UserController(UserService userService) {
        this.userService=userService;
    }
}

但是当需要注入的对象有很多时,构造器的参数就会增多,代码就会变得臃肿起来。那么可以使用 Lombok 提供的注解来简化操作,在类上使用 @RequiredArgsConstructor 注解,将注入的字段注为 final 类型,如下:

@RequiredArgsConstructor
public class UserController {
    private final UserService userService;
}

Lombok 会自动生成含有 final 类型字段的构造器:

在这里插入图片描述

但是构造器注入无法解决循环依赖的问题。

Setter 方法注入

Setter 方法注入是通过 set 的方式注入依赖,如下:

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

这一方式可以解决循环依赖的问题,但是也不能注入 final 类型的字段。


总结:最好的解决方案是用构造器参数实现强制依赖,Setter 方法实现可选依赖。

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

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

相关文章

【C++】8.编译:CMake工具入门

😏*★,*:.☆( ̄▽ ̄)/$:*.★* 😏这篇文章主要介绍CMake工具的入门使用。————————————————学其所用,用其所学。——梁启超————————————————— 欢迎来到我的博客,一起学习知识…

Istio Ambient Mesh L4: 剖析ztunnel组件的工作原理

前言 早在2021年,Istio就开始了共享代理模式的探索,并于2022年9月推出的Ambient Mesh——无Sidecar的全新数据平面模式,目前还未发布正式版本。 这篇博客是花了好多时间收集整理出来的,按照学习思路,先简介了 Istio …

vue3项目搭建超详解

vue3安装与目录讲解 文章目录 vue3安装与目录讲解安装node.jsnpm绑定淘宝镜像安装vue脚手架创建vue项目目录解释推荐使用vscode 安装node.js http://nodejs.cn/download/ 根据自己电脑的位数自行下载。可安装到任意盘哈,因为我C盘比较大,我就直接在C盘了…

[IOT物联网]Python快速上手开发物联网上位机程序——前言

一、什么是Python Python是一种简单易学、高级、通用的编程语言。它是一种解释型语言,不需要编译即可运行,因此可以快速地进行开发和测试。Python具有简洁优美的语法,使用它可以提高生产力和代码可读性。Python拥有强大的标准库和第三方库&am…

windows10下设置本地apache\nginx站点部署ssl证书,使本地配置的域名可以用https访问

首先我们需要下载openssl来生成证书文件: 去官方网址下载https://slproweb.com/products/Win32OpenSSL.html; 下载好了,双击exe文件,然后就下一步,下一步安装完成; 安装之后配置环境变量,新建…

工赋开发者社区 | 何谓智能工厂?国内外智能工厂建设的现状分析

导读 本文将分析国内外智能工厂建设的现状与问题,智能工厂的内涵,以及推进智能工厂建设的成功之道。 1 国内外智能工厂建设的现状分析 近年来,全球各主要经济体都在大力推进制造业的复兴。在工业4.0、工业互联网、物联网、云计算等热潮下&am…

MDPI参考文献引用

在引参考文献的时候,MDPI论文有一个统一的格式要求,这里是帮助那些不会快速引文献的同学快速引用MDPI格式的参考文献。 【1】首先安装endnote,并创建仓库 【2】下载endnote识别的MDPI输出参考文献格式类型:https://endnote.com/style_downl…

【移动端网页布局】flex 弹性布局子项目属性 ② ( align-self 子项目属性 - 设置指定子项目元素侧轴排列方式 | 代码示例 )

文章目录 一、align-self 子项目属性 - 设置指定子项目元素侧轴排列方式二、代码示例 - 设置指定子项目的侧轴排列方式 一、align-self 子项目属性 - 设置指定子项目元素侧轴排列方式 align-self 子项目属性 用于 控制 子项目 在 侧轴 上的排列方式 ; align-self 子项目属性样…

C/C++访问MySQL数据库(非常详细的配置,一步一步的来,细心看我,不会你怪我)

第一步: 打开mysql的安装目录,默认安装目录如下:C:\Program Files\MySQL\MySQL Server 8.0,确认 lib 目录和 include 目录是否存在。 第二步: 打开VS2019,新建一个空工程,控制台应用程序即可,注…

web安全之CSRF漏洞——苦日7小时

CSRF_exercise CSRF(Cross-Site Request Forgery)攻击,也称为“跨站请求伪造”攻击,是一种利用用户已登录的身份在用户不知情的情况下,向服务器发送恶意请求的攻击方式。攻击者可以通过构造一些针对被攻击网站的特定请…

无锁化栈、队列深入解析及实现

首先声明,本文探讨实现的无锁化栈、队列皆是通过CAS硬件原语实现,且没有解决ABA问题。 之前比赛一直有看到无锁化编程优化部分,但一直没有实践过,(这里主要是使用的CAS,当然lock-free实现其实有好几种,这取决于具体的…

Django006:ModelForm组件

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

SpringBoot @Async异步线程 + CompletableFuture使用

参考资料 SpringBoot 最简单的使用异步线程案例 AsyncSpringboot Async异步扩展使用 结合 CompletableFuture 目录 一. 配置线程池二. 耗时任务1三. 耗时任务2四. 调用 一. 配置线程池 当池子大小小于corePoolSize,就新建线程,并处理请求当池子大小等于…

[golang gin框架] 31.Gin 商城项目- 提交订单逻辑操作以及去支付页面制作

一.界面展示 确认订单页面 确认订单页面相关逻辑见 golang gin框架] 30.Gin 商城项目- 购物车商品确认页面以及收货地址的增删改查 点击 去支付按钮逻辑: (1).判断用户是否存在地址,不存在则新增并设置为默认地址 (2).点击去支付,请求提交订单执行结算操作: 订单执行结算操作步…

C语言-【移位操作符详解】

这篇文章主要介绍了C语言中移位操作符,文章中通过详细的代码以及有关计算机中零碎的知识点对移位操作符进行了一个更好的解释,需要的小伙伴们可以一起学习学习吖~ 移位操作符:移动的是补码的二进制序列。 在C语言当中,有两种移位…

English Learning - L3 作业打卡 Lesson2 Day8 2023.5.12 周五

English Learning - L3 作业打卡 Lesson2 Day8 2023.5.12 周五 引言🍉句1: The color green is natural for trees and grass.成分划分弱读语调 🍉句2: But it is an unnatural color for humans.成分划分弱读连读语调 🍉句3: A person who h…

React | React组件化开发(二)

✨ 个人主页:CoderHing 🖥️ React .js专栏:React .js React组件化开发(二) 🙋‍♂️ 个人简介:一个不甘平庸的平凡人🍬 💫 系列专栏:吊打面试官系列 16天学会Vue 11天学会React …

【TOP生物信息】使用SingleR注释细胞类型

扫码关注下方公粽号,回复推文合集,获取400页单细胞学习资源! 本文共计1887字,阅读大约需要6分钟,目录如下: SingleR基本介绍 SingleR包安装 SingleR包使用 1.使用已有的参考数据集进行细胞定义2.使用自定…

NAS内网穿透

3)可用方法1:Tailscale(免费) Tailscale 是一种基于 WireGuard 的虚拟组网工具 下面教大家安装: 镜像仓库搜索:tailscale,就是第一个 下载之后安装配置注意: 1)要把权限全部打开…

C++游戏服务器框架笔记(四)_封装Select

C游戏服务器框架笔记(一)_封装数据包类 C游戏服务器框架笔记(二)_封装Socket类 C游戏服务器框架笔记(三)_封装ByteBuffer类 C游戏服务器框架笔记(四)_封装Select 因为设想的次系列服务器主要应用场景是linux系统下,支持Windows系统是为了更好的调试和开发&#x…