@RequiredArgsConstructor实现构造器注入

@RequiredArgsConstructor实现构造器注入

1. @Autowired@Resource 注解

@Autowired
  • @Autowired 是 Spring 框架提供的注解,用于自动装配依赖。
  • 可以用于字段、构造函数和 setter 方法。
@Autowired
private ISysUserService userService;
@Resource
  • @Resource 是 Java EE 提供的注解,Spring 也支持它,用于自动装配依赖。
  • 一般用于字段和 setter 方法。
@Resource
private ISysUserService userService;

2. 构造函数注入

使用 Lombok 的 @RequiredArgsConstructor

springboot @RequiredArgsConstructor的概念与使用-腾讯云开发者社区-腾讯云 (tencent.com)

  • @RequiredArgsConstructor 是 Lombok 提供的注解,它会自动生成包含所有 final 字段的构造函数。
  • 使用构造函数注入可以确保依赖注入在对象创建时完成,确保所有依赖都是非空的。
@RequiredArgsConstructor
@RestController
@RequestMapping("/system/user")
public class SysUserController extends BaseController {
    private final ISysUserService userService;
    private final ISysRoleService roleService;
    private final ISysPostService postService;
    private final ISysDeptService deptService;
    private final ISysUserPostService userPostService;
    
    // 构造函数由 Lombok 自动生成,注入所有 final 字段
}

3. 比较和优点

字段注入(@Autowired@Resource
  • 优点:代码简洁,直接在字段上注解。
  • 缺点
    • 难以进行单元测试,因为需要通过反射或其他方式注入 mock 对象。
    • 依赖注入发生在对象创建之后,可能导致依赖未完全初始化的问题。
    • 违反了依赖倒置原则,类直接依赖于容器。
构造函数注入
  • 优点
    • 强制依赖在对象创建时就完全初始化,确保所有依赖非空。
    • 更容易进行单元测试,因为可以通过构造函数注入 mock 对象。
    • 更符合依赖倒置原则,使类更独立于容器。
    • 提升了代码的可读性和可维护性,尤其是当依赖较多时。
  • 缺点:需要额外的构造函数代码,但使用 Lombok 的 @RequiredArgsConstructor 可以减轻这个负担。

4. 示例对比

使用 @Autowired
@RestController
@RequestMapping("/system/user")
public class SysUserController extends BaseController {
    
    @Autowired
    private ISysUserService userService;
    
    @Autowired
    private ISysRoleService roleService;
    
    @Autowired
    private ISysPostService postService;
    
    @Autowired
    private ISysDeptService deptService;
    
    @Autowired
    private ISysUserPostService userPostService;

    // 其他代码
}
使用构造函数注入
@RequiredArgsConstructor
@RestController
@RequestMapping("/system/user")
public class SysUserController extends BaseController {
    private final ISysUserService userService;
    private final ISysRoleService roleService;
    private final ISysPostService postService;
    private final ISysDeptService deptService;
    private final ISysUserPostService userPostService;

    // 其他代码
}

通过这种构造函数注入的方式,不仅可以增强代码的健壮性和可维护性,还可以更好地利用 Spring 的依赖注入特性和 Lombok 的简化代码的优势。

好处

Spring的构造器注入_spring构造器注入-CSDN博客
请添加图片描述

5.关于注解

在使用构造函数注入时,不需要额外添加注解,只需要提供构造函数即可。Spring 会自动检测到你的构造函数并进行依赖注入。

使用构造函数注入,不需要额外注解
@RestController
@RequestMapping("/system/user")
public class SysUserController extends BaseController {
    private final ISysUserService userService;
    private final ISysRoleService roleService;
    private final ISysPostService postService;
    private final ISysDeptService deptService;
    private final ISysUserPostService userPostService;

    // 自己编写构造函数
    public SysUserController(ISysUserService userService, 
                             ISysRoleService roleService, 
                             ISysPostService postService, 
                             ISysDeptService deptService, 
                             ISysUserPostService userPostService) {
        this.userService = userService;
        this.roleService = roleService;
        this.postService = postService;
        this.deptService = deptService;
        this.userPostService = userPostService;
    }
}
使用构造函数注入的要点
  1. 定义构造函数:
    • 在类中定义一个包含所有需要依赖的构造函数。
  2. Spring 自动注入:
    • Spring 在创建 Bean 实例时,会自动识别并调用该构造函数,同时注入所需的依赖。

示例代码

package com.example.demo.controller;

import com.example.demo.service.ISysUserService;
import com.example.demo.service.ISysRoleService;
import com.example.demo.service.ISysPostService;
import com.example.demo.service.ISysDeptService;
import com.example.demo.service.ISysUserPostService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/system/user")
public class SysUserController {

    private final ISysUserService userService;
    private final ISysRoleService roleService;
    private final ISysPostService postService;
    private final ISysDeptService deptService;
    private final ISysUserPostService userPostService;

    // 构造函数注入
    public SysUserController(ISysUserService userService, 
                             ISysRoleService roleService, 
                             ISysPostService postService, 
                             ISysDeptService deptService, 
                             ISysUserPostService userPostService) {
        this.userService = userService;
        this.roleService = roleService;
        this.postService = postService;
        this.deptService = deptService;
        this.userPostService = userPostService;
    }

    // 你的控制器方法
}

在这个例子中,不需要使用任何额外的注解来标注构造函数,Spring 会自动识别并注入依赖。(当然,标注了也不会报错,但是只能使用@Autowired,不能使用@Resouce,@Resource 注解通常用于字段或 setter 方法注入)

额外情况
  1. 多个构造函数:
    • 如果一个类中有多个构造函数,并且其中只有一个构造函数有注入参数,Spring 会使用这个构造函数进行注入。
    • 如果有多个构造函数都有注入参数,则需要使用 @Autowired 注解来明确指定使用哪个构造函数。

示例代码(多个构造函数)

package com.example.demo.controller;

import com.example.demo.service.ISysUserService;
import com.example.demo.service.ISysRoleService;
import com.example.demo.service.ISysPostService;
import com.example.demo.service.ISysDeptService;
import com.example.demo.service.ISysUserPostService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/system/user")
public class SysUserController {

    private final ISysUserService userService;
    private final ISysRoleService roleService;
    private final ISysPostService postService;
    private final ISysDeptService deptService;
    private final ISysUserPostService userPostService;

    // 使用 @Autowired 明确指定使用哪个构造函数
    @Autowired
    public SysUserController(ISysUserService userService, 
                             ISysRoleService roleService, 
                             ISysPostService postService, 
                             ISysDeptService deptService, 
                             ISysUserPostService userPostService) {
        this.userService = userService;
        this.roleService = roleService;
        this.postService = postService;
        this.deptService = deptService;
        this.userPostService = userPostService;
    }

    // 另一个构造函数
    public SysUserController(ISysUserService userService) {
        this.userService = userService;
        this.roleService = null;
        this.postService = null;
        this.deptService = null;
        this.userPostService = null;
    }

    // 你的控制器方法
}

在这个例子中,由于存在多个构造函数,需要使用 @Autowired 注解来明确指定 Spring 使用哪个构造函数进行依赖注入。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java 中的 switch 语句:类型支持与限制

Java 中的 switch 语句:类型支持与限制 1、switch 语句支持的数据类型2、switch 语句不支持的数据类型3、总结 💖The Begin💖点点关注,收藏不迷路💖 在 Java 中,switch 语句是一种用于多分支选择的控制结构…

物联网专业现代学徒制人才培养质量评价体系构建

一、 引 言 随着信息技术的飞速发展,物联网(IoT)技术已成为推动全球信息化、智能化发展的关键力量。物联网专业人才的培养质量直接关系到行业的创新能力和竞争力。现代学徒制作为一种创新的人才培养模式,已被广泛应用于职业教育中…

HCIP.ppp协议(点到点)认证阶段

ppp协议 ppp是点到点的协议 1.兼容性很好 2.可以进行认证和授权 3.可移植性强 三个阶段 1.链路协商阶段 LCP协商------去协商ppp链路会话 2.认证(可选) 3.NCP协商------网络层协商阶段(根据网络层的不同NCP协议就会存在一个对应的NC…

查看尝试登服务器ssh 访问ip地址

不指定时间查看尝试登录服务器的SSH访问IP地址 # CentOS/RHEL系统 zgrep "sshd" /var/log/secure-* | grep "Failed password" | awk {print $(NF-3)} | sort | uniq -c | sort -nr | head -n 10检查过去7天的日志尝试登录服务器的SSH访问IP地址 # CentOS…

QT--SQLite

配置类相关的表,所以我使用sqlite,且QT自带该组件; 1.安装 sqlite-tools-win-x64-3460000、SQLiteExpert5.4.31.575 使用SQLiteExpert建好数据库.db文件,和对应的表后把db文件放在指定目录 ./db/program.db; 2.选择sql组件 3.新…

GaussDB关键技术原理:高性能(五)

GaussDB关键技术原理:高性能(四)从USTORE存储引擎、计划缓存计划技术、数据分区与分区剪枝、列式存储和向量化引擎、SMP并行执行等五方面对高性能关键技术进行解读,本篇将从LLVM动态查询编译执行、SQL-BYPASS执行优化、线程池化、…

【文档+源码+调试讲解】冷冻仓储管理系统

摘 要 随着互联网时代的到来,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛。因此,建立一个B/S结构的冷冻仓储管理系统,会使冷冻仓储管理系统工作系统化、规范化,也会提高冷冻仓储管理系统平台形象&#x…

若依搭建 帝可得 售货机 笔记

一、搭建项目 1.后端gitee链接: 启动项目时记得修改mysql和redis的相关信息;创建项目相关数据库,并导入初始化的SQL脚本 dkd-parent: 帝可得后台管理系统 (gitee.com) 2.前端gitee链接: 启动项目时记得安装依赖:np…

IPv4与IPv6的定义和主要区别

IPv4与IPv6的定义 IPv4,即互联网协议版本4(InternetProtocolversion4),是互联网使用最为广泛的协议之一。它采用32位地址,以点分十进制表示,如192.168.1.1。 IPv6,即互联网协议版本6&#xff…

自动驾驶革命:商汤科技突破性大模型UniAD震撼登场

自动驾驶革命:商汤科技突破性大模型UniAD震撼登场! 在人工智能的浪潮中,自动驾驶技术一直是科技巨头们竞相追逐的圣杯。而今,商汤科技联合上海人工智能实验室与武汉大学,以一篇名为"Planning-oriented Autonomou…

Shader每日一练(2)护盾

Shader "Custom/Shield" {Properties{_Size("Size", Range(0 , 10)) 1 // 控制噪声纹理缩放大小的参数_colorPow("colorPow", Float) 1 // 控制颜色强度的指数_colorMul("colorMul", Float) 1 // 控制颜色乘法因子_mainColor("…

政安晨:【Keras机器学习示例演绎】(五十四)—— 使用神经决策森林进行分类

目录 导言 数据集 设置 准备数据 定义数据集元数据 为训练和验证创建 tf_data.Dataset 对象 创建模型输入 输入特征编码 深度神经决策树 深度神经决策森林 实验 1:训练决策树模型 实验 2:训练森林模型 政安晨的个人主页:政安晨 欢…

【机器学习】独立成分分析(ICA):解锁信号的隐秘面纱

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 独立成分分析(ICA):解锁信号的隐秘面纱引言I…

人工智能算法工程师(中级)课程3-sklearn机器学习之数据处理与代码详解

大家好,我是微学AI,今天给大家分享一下人工智能算法工程师(中级)课程3-sklearn机器学习之数据处理与代码详解。 Sklearn(Scikit-learn)是一个基于Python的开源机器学习库,它提供了简单有效的数据挖掘和数据分析工具。Sklearn包含了…

webstorm问题解决:无法识别 @

问题解决tsconfig.json 问题 本地的 vite.config.ts 已经配置 路径 但是,我用webstorm 上识别不了 解决 新增文件tsconfig.json,添加 baseUrl 和 paths 的配置,以告诉 TypeScript 和 WebStorm 如何解析路径别名 tsconfig.json {&quo…

无需构建工具,快速上手Vue2 + ElementUI

无需构建工具,快速上手Vue2 ElementUI 在前端开发的世界中,Vue.js以其轻量级和易用性赢得了开发者的青睐。而Element UI,作为一个基于Vue 2.0的桌面端组件库,提供了丰富的界面组件,使得构建美观且功能丰富的应用变得…

禁止使用存储过程

优质博文:IT-BLOG-CN 灵感来源 什么是存储过程 存储过程Stored Procedure是指为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户可通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行。 …

AndroidStudio2023.3版本avd manager模拟器无法创建

创建到最后一步的时候提示WARN - #com.android.sdklib.internal.avd.AvdManager - com.android.prefs.AndroidLocationsException: Can’t locate Android SDK installation directory for the AVD .ini file. 前提: 1.sdk路径没问题 2.安装了下图内容 那是什么原因…

Linux /etc/profile 详解

概述 Linux是一个多用户的操作系统。每个用户登录系统后,都会有一个专用的运行环境。通常每个用户默认的环境都是相同的,这个默认环境实际上就是一组环境变量的定义。用户可以对自己的运行环境进行定制,其方法就是修改相应的系统环境变量&…

原生小程序生成二维码并保存到本地

需求:我要在一个页面中生成一个二维码,并且这个二维码可以长按保存到本地或者发送给好友; 我这里是将生成的canvas二维码转换成图片,利用长按图片进行保存或转发 效果图: 第一步先下载对应的包: npm instal…