你还在用@Autowired和@Resource?
创始人
2024-05-24 09:07:43
0

直接上总结:我们在类上使用 Lombok的@RequiredArgsConstructor 注解来替代类中的多处@Autowired和@Resource

依赖注入

先回顾一下Spring的3种依赖注入。

  1. 属性注入
public class SysUserController extends BaseController {@Autowiredprivate ISysUserService userService;@Resourceprivate ISysRoleService roleService;
}

@Autowired默认按类型装配,@Resource默认按名称装配,当找不到与名称匹配的bean时,才会按类型装配。

而@Qualifier和Autowired配合使用,指定bean的名称,也可以做到按名称装配。

IDEA中直接在变量上使用 @Autowired会发现警告提示:Field injection is not recommended

原因是官方建议我们使用构造器注入方式,这种方式存在明显的弊端,比如:注入对象不能用final修饰、无法发现NullPointException的存在。

  1. 构造器注入
public class SysUserController extends BaseController {private final ISysUserService userService;private final ISysRoleService roleService;public SysUserController(ISysUserService userService, ISysRoleService roleService) {this.userService = userService;this.roleService = roleService;}
}

构造器依赖注入通过容器触发一个类的构造器来实现的,通过强制指明依赖注入来保证这个类的运行,防止NullPointerException

Spring官方推荐使用构造器注入不仅是因为这种情况下成员属性可以使用final关键字修饰,更关键的一点是能够避免循环依赖,如果存在循环依赖,Spring项目启动的时候就会报错。

为什么说是避免而不是解决呢?

因为构造器注入是通过构造方法来生成对象,其必须要先获取属性,才能生成调用构造方法进行实例化,这种情况的循环依赖是无法解决的。

下面通过一张图来看下A、B俩相互依赖的对象注入方式不同时Spring能否解决循环依赖的情况:

构造器注入方式解决循环依赖:
1.代码重构
2.@Lazy注解
3.改用属性注入

  1. Setter注入
public class SysUserController extends BaseController {private ISysUserService userService;@Autowiredpublic void setUserService(ISysUserService userService) {this.userService = userService;}
}

需要注意的是,在使用Setter注入时需要加@Autowired@Resource注解,否则是无法注入成功的。

另外要注意一点,属性注入和Setter注入的变量都无法使用final关键字修饰。

@RequiredArgsConstructor

这里可能会有人说不推荐使用Lombok,只要我们知其然且知其所以然,那他就是一个帮助我们快速开发的好工具。

在说完Spring的三种依赖注入后,我们来认识一下Lombok的@RequiredArgsConstructor 注解。

在Lombok中,生成构造方法的注解一共有三个,分别是@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsContructor,我们这里只介绍@RequiredArgsConstructor。

@Controller
@RequiredArgsConstructor
public class SysUserController extends BaseController {private final ISysUserService userService;private ISysRoleService roleService;//----------------------------
}
复制代码

使用@RequiredArgsConstructor会为我们生成一个包含常量、使用final关键字修饰的变量私有构造方法

那我们就可以不使用属性注入(@Autowired和@Resource)的方式,直接通过构造器的方式来完成注入,不仅能够省略简化许多代码,也解决了属性注入可能存在的空指针问题。

 

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...