@RequiredArgsConstructor实现构造器注入

news2024/10/8 14:51:42

@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 使用哪个构造函数进行依赖注入。

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

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

相关文章

Python-PLAXIS自动化建模技术与典型岩土工程

原文链接:Python-PLAXIS自动化建模技术与典型岩土工程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247608744&idx3&sn41d9fd9ab6e792850000c4990b3f8c65&chksmfa82684fcdf5e15990e4681f032ce9b295a9e2071051218f550a7e63e4ebedee29559d56…

Linux下vim工具应用

1.简介 Vim(Vi IMproved)是一种高度可配置的文本编辑器,用于有效地创建和更改任何类型的文本。它是从vi发展而来,vi是Unix和类Unix系统上最初的文本编辑器之一。Vim被设计为程序员和文本编辑的爱好者使用,它以其强大的…

广度优先(BFS)

先看一道简单的题&#xff0c;迷宫问题&#xff1a; 洛谷P1746 离开中山路&#xff1a;P1746 离开中山路 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<iostream> #include<cstring> #include<queue> #include <utility> #define N 1002 …

Jenkins设置开机自启(以war包方式启动jenkins)

配置环境&#xff1a;Centos7.6/Jenkins 2.452.2/jdk-21.0.3 jenkins启动命令&#xff1a; nohup java -jar jenkins.war > /dev/null 2>&1 & 1、创建sh脚本文件 # jenkins.war包&#xff0c;放在了/root/software目录 cd /root/software vim jenkins-start.sh …

Matter Open Day:全球生态首秀,中国力量引领智能家居新纪元

▲ 会场全景 7月8日下午&#xff0c;广州南丰朗豪大酒店内人声鼎沸&#xff0c;由连接标准联盟和连接标准联盟‍中国成员组(CMGC)共同主办的首届 Matter Open Day 活动圆满落下帷幕。 此次盛会不仅标志着智能家居领域的一次重要聚首&#xff0c;更见证了连接标准联盟(原Zigbee…

用Python编写一个模拟usb摄像头的程序

昨天有个朋友找我要刷点政府的再就业的视频课&#xff0c;说是就是用浏览器打开固定的网站&#xff0c;然后用身份证号码登录&#xff0c;然后播放里面的视频&#xff0c;不定时的网页会通过usb摄像头拍照做人脸识别&#xff0c;就是这么一个简单的要求&#xff0c;叫我给想想办…

论文AI痕迹过重怎么办?AI降痕工具来帮忙

如何有效利用AI工具提高工作效率&#xff1f;探索这5款顶级AI写作工具 不知道大家有没有发现&#xff0c;随着人工智能技术的快速发展&#xff0c;AI工具正逐渐渗透到我们日常生活的各个方面&#xff0c;极大地提高了我们的工作和学习效率。无论是AI写作、AI绘画、AI思维导图&…

AI算力发展现状与趋势分析

综合算力发展现状与趋势分析 在数字经济的疾速推动下&#xff0c;综合算力作为驱动各类应用和服务的新型生产力&#xff0c;其价值日益凸显。我们深入探讨了综合算力的定义、重要性以及当前发展状况&#xff1b;并从算力形态、运力性能和存储技术等角度&#xff0c;预见了其发展…

C语言实战 | 弹跳的小球

C语言实战——实现弹跳的小球 01、综合案例 编写程序&#xff0c;实现小球(小方块)在屏幕内斜向运动&#xff0c;遇到边界发生反弹&#xff0c;如图2.6所示。 ■ 图2.6弹跳的小球 在例2.2中&#xff0c;通过变量drow、dcol控制方块的运动方向&#xff0c;例如斜向右下运动&am…

从实时监控到风险智能预警:EasyCVR视频AI智能监控技术在工业制造中的应用

随着科技的不断进步和工业制造领域的持续发展&#xff0c;传统的生产管理方式正逐渐转型&#xff0c;迈向更加智能、高效和安全的新阶段。在这个变革过程中&#xff0c;视频智能监控技术凭借其独特的优势&#xff0c;成为工业制造领域的管理新引擎&#xff0c;推动着从“制造”…

真实测评网上较火的两款智能生成PPT产品:秒出PPTAI PPT

测评两款AI生成PPT的工具&#xff1a;秒出PPT和AI PPT。这俩个款是目前竞争比较激烈的且使用起来比较好的产品。一下主要从PPT模板、一键生成及生成效果、Word转PPT来分析一下使用感受。 秒出PPT 秒出PPT是集模板站与编辑站一体的产品&#xff0c;支持微信扫码登录。主页可以直…

Leetcode—236. 二叉树的最近公共祖先【中等】

2024每日刷题&#xff08;142&#xff09; Leetcode—236. 二叉树的最近公共祖先 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL…

realsense D435l+mid360标定

目录 一、安装realsense环境 二、获取realsense D450L相机内参 三、标定雷达和相机 1.下载livox_camera_calib 2.修改配置参数 3.使用fastlio生成点云 4.标定 一、安装realsense环境 git clone https://github.com/IntelRealSense/librealsense.git cd librealsense //更…

JAVASE进阶day07(泛型,集合,Set,TreeSet,枚举,数据结构)

泛型 1.泛型的基本使用 限制集合存储的数据类型 package com.lu.day07.generics;/*** 定义了一个泛型类* E 泛型通配字母(不固定代替真实数据类型A-Z都可以)* 常见的泛型通配字母:* E:element 元素* T:type 类型* R:return 返回值类型* K:key 键* …

Blender 中导出模型fbx

准备模型&#xff1a;确保你的模型已经完成&#xff0c;并且所有的材质、纹理等都已设置好。 应用所有变换&#xff1a; 选择模型&#xff0c;按下 CtrlA&#xff0c;选择 "All Transforms" 以应用所有的变换&#xff08;位置、旋转和缩放&#xff09;。 导出模型&a…

sql常用语句:

1.联合查询 对表中的数据进行限制&#xff1b; 2.从一个表复制到另一个表 SELECT INTO 将数据复制到一个新表&#xff08;有的 DBMS 可以覆盖已经存在的表&#xff0c;这依赖于 所使用的具体 DBMS&#xff09; SELECT *&#xff08;字段&#xff09; INTO CustCopy FROM Cu…

【Redis】简单了解Redis中常用的命令与数据结构

希望文章能给到你启发和灵感&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏 支持一下博主吧&#xff5e; 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、Redis的特点和适用场景三、Redis的数据类型和使用3.1字符串&#xff08;String&…

ThinkPad,联想电脑F1(声音键)一直显示(亮)解决办法

ThinkPad&#xff0c;联想电脑F1&#xff08;声音键&#xff09;一直显示&#xff08;亮&#xff09; 打开“服务” 找到&#xff1a;Lenovo Hotkey Client Loader&#xff0c;选择”启动“

十九.升职加薪系列-JVM优化-解决JVM性能瓶颈的JIT即时编译器

前言 在很多年以前&#xff0c;做C或者C的程序员经常说Java语言的运行速度不如C或C&#xff0c;Java运行速度慢主要是因为它是解释执行的&#xff0c;而C或C是编译执行的&#xff0c;解释执行需要通过JVM虚拟机将字节码实时翻译成机器码&#xff08;边翻译边执行&#xff09;&…

ArcGIS Pro入门制图教程

地理信息系统 (GIS) 是一种使用地图显示和分析数据的方式。在本教程中&#xff0c;您将学习桌面 GIS 应用程序 ArcGIS Pro 的基础知识。 新加坡的一家旅行社希望制作一款宣传册&#xff0c;用于向游客介绍距离市中心热门目的地最近的火车站。该宣传册将与带有文本信息的地图相…