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

news/2025/3/15 1:00:21/

文章目录

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

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

字段注入缺点

无法注入 final 字段

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

public class UserController {@Autowiredprivate 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;@Autowiredpublic 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;@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}
}

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


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


http://www.ppmy.cn/news/68491.html

相关文章

算法修炼之练气篇——练气七层

博主:命运之光 专栏:算法修炼之练气篇 前言:每天练习五道题,炼气篇大概会练习200道题左右,题目有C语言网上的题,也有洛谷上面的题,题目简单适合新手入门。(代码都是命运之光自己写的…

Git常用操作:基础命令、生成公钥、webhook同步

这里写目录标题 下载安装GIT基础命令克隆初始化与仓库建立连接下拉代码提交代码清空本地缓存 本地生成GIT公钥webhook(本地-码云-服务器代码同步) 下载安装GIT 此处只介绍windows系统下的安装,linux一般都是自带git(自行百度&…

Windows下git和github的使用

介绍windows下的git和GitHub使用。 一、注册gihub账号 github官网:https://github.com 自行创建即可。 登录,create repository新建仓库一个测试库readme,创建完成。 二、git的安装 git官方网站:https://git-scm.com/ 选择Wi…

UNIAPP实战项目笔记70 购物车删除商品的前后端交互

UNIAPP实战项目笔记70 购物车删除商品的前后端交互 思路 需要用到vuex 传id值到后端,删除指定id购物车数据 案例截图 购物车商品编辑页面 代码 后端代码 index.js var express require(express); var router express.Router(); var connection require(../db/sql.js); va…

python进阶--月考三

python进阶--月考三 (一)装饰器(二)创建名为express.py文件,编写以下推导式(三)创建一个process_study.py 编写一个多进程程序(四)创建一个thread_study.py 编写一个多线…

代码随想录算法训练营第二十三天|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

目录 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 669. 修剪二叉搜索树 这道题目比较难,比 添加增加和删除节点难的多,建议先看视频理解。 题目链接/文章讲解: 代码随想录 题解思路: 多…

python和pycharm的安装(安装包免费下载共享)

说明: 本文内容包括Python和Pycharm安装。 一、python安装: python是一门编程语言,安装python是为了能在电脑上使用这门语言。 1、python下载 下载链接:https://pan.baidu.com/s/1mWsJjO8HngNQtINCzu0bBA 提取码:9…

Java中的SLF4J是什么?如何使用SLF4J进行日志管理

在Java开发中,日志管理是一个非常重要的问题。日志管理可以帮助开发人员更好地了解应用程序的运行情况,以及快速诊断和解决问题。而SLF4J是Java中最常用的日志管理框架之一。在本文中,我们将详细介绍SLF4J的概念和使用方法。 什么是SLF4J&am…