Spring Boot中Bean的 构造器注入、字段注入和方法注入

在Spring中,依赖注入(DI)是实现控制反转(IoC)的一种方式,Spring提供了多种注入方式来将依赖关系注入到Bean中,常见的方式有构造器注入、字段注入和方法注入。下面将详细介绍这三种注入方式。

1. 构造器注入(Constructor Injection)

构造器注入是通过构造函数将依赖项注入到Spring Bean中。Spring容器会在创建Bean时,通过调用构造方法来注入依赖。

特点:
  • 适用于依赖是必需的情况。
  • 在Bean的构造函数中显式声明需要注入的依赖。
  • 一旦通过构造器注入后,Bean的依赖关系是不可变的(通常是final类型)。
使用方法:
  • 可以使用@Autowired注解标注构造器,Spring会自动选择构造器并注入需要的依赖。如果没有指定,Spring会注入符合构造函数参数的Bean。
@Component
public class MyService {private final MyRepository myRepository;@Autowired//可不写public MyService(MyRepository myRepository) {this.myRepository = myRepository;}public void performAction() {myRepository.saveData();}
}
  • 如果有多个构造器,Spring默认会注入标记有@Autowired注解的构造器。如果没有标注@Autowired,Spring会选择唯一一个构造函数来进行注入。
优点:
  • 强制依赖:确保依赖在Bean创建时就被注入,避免出现空指针异常。
  • 不可变性:构造器注入通常能确保类的依赖关系是不可变的。
缺点:
  • 如果依赖关系较多,构造函数参数过多,可能会导致代码不太易读。

2. 字段注入(Field Injection)

字段注入是直接通过成员变量来注入依赖,Spring通过反射机制将依赖项注入到字段中,而无需显式地调用构造函数或方法。

特点:
  • 简单、直接。
  • 容易实现,但不推荐使用,因为它无法通过构造函数验证依赖关系,可能会导致注入失败或不明显的错误。
使用方法:
  • 只需要在字段上标注@Autowired注解,Spring会自动将对应的Bean注入到字段中。
@Component
public class MyService {@Autowiredprivate MyRepository myRepository;public void performAction() {myRepository.saveData();}
}
优点:
  • 代码简洁,容易实现。
  • 无需显式定义构造函数或Setter方法。
缺点:
  • 不可测试:字段注入使得类变得不易测试,因为我们无法通过构造函数或方法来明确传入依赖。
  • 耦合性强:使得类的依赖关系不明显,无法明确标识哪些依赖是必需的。
  • 违反封装性:字段注入依赖于Spring容器的反射机制,失去了封装的优势。

3. 方法注入(Setter Injection)

方法注入通过设置方法来注入依赖。Spring容器通过调用Setter方法来注入需要的Bean。

特点:
  • 适用于依赖关系是可选的或可以在Bean的生命周期中修改的情况。
  • 可以通过@Autowired注解标注Setter方法,Spring会自动注入相应的依赖。
使用方法:
  • 在Setter方法上加上@Autowired注解,Spring会自动调用该方法并注入依赖。
@Component
public class MyService {private MyRepository myRepository;@Autowiredpublic void setMyRepository(MyRepository myRepository) {this.myRepository = myRepository;}public void performAction() {myRepository.saveData();}
}
优点:
  • 适用于依赖关系可变的场景,可以在对象创建后进行注入。
  • 如果有多个依赖,Setter方法可以逐个注入。
缺点:
  • 不如构造器注入那样强制依赖,可能导致部分依赖未注入,进而影响系统稳定性。
  • 可能导致依赖关系不明确,增加了代码的耦合度。

总结对比:

注入方式适用场景优点缺点
构造器注入依赖关系不可变,且依赖为必需的情况强制依赖、易于测试、不可变性参数较多时不易读,灵活性差
字段注入简单、快速的注入,依赖可选或不复杂的情况简单、代码简洁、实现快速不易测试、依赖关系不明确、耦合度高
方法注入依赖关系可变,依赖为可选的情况适合依赖可变、Setter可重复调用依赖关系不明确、可能导致空指针异常

总结建议:

  • 对于必需依赖,推荐使用构造器注入,因为它强制要求依赖关系的明确性并且不可变。
  • 对于可选依赖,或者在需要某种后期注入的情况下,可以使用Setter方法注入
  • 字段注入虽然代码最简洁,但不推荐用于生产环境,因为它不利于依赖关系的管理和测试。

这些注入方式各有特点,根据不同的应用场景选择最合适的方式可以帮助提高代码的可维护性和可测试性。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hexo Next主题集成百度统计

个人博客地址:Hexo Next主题集成百度统计 | 一张假钞的真实世界。 首先,需要在百度统计控制台新增自己的站点。 点击“新增网站”按钮: 按照要求输入相关信息并保存,页面跳转至代码获取页面。从代码页面中拷贝网站的ID&#xff1…

8K+Red+Raw+ProRes422分享5个影视级视频素材网站

Hello,大家好,我是后期圈! 在视频创作中,电影级的视频素材能够为作品增添专业质感,让画面更具冲击力。无论是广告、电影短片,还是品牌宣传,高质量的视频素材都是不可或缺的资源。然而&#xff…

JumpServer开源堡垒机搭建及使用

目录 一,产品介绍 二,功能介绍 三,系统架构 3.1 应用架构 3.2 组件说明 3.3 逻辑架构 3.3 逻辑架构 四,linux单机部署及方式选择 4.1 操作系统要求(JumpServer-v3系列版本) 4.1.1 数据库 4.1.3创建数据库参考 4.2 在线安装 4.2.1 环境访问 4.3 基于docker容…

华为云计算HCIE笔记01

第一章 华为云Stack解决方案 2018年云栖大会马云提出的数据科学时代(Data technology),相较于传统信息时代,技术的变更主要集中在过去我们更加看重的是传输,也就是传统的网络建设,随着目前国家网络建设的完…

Redis的主从集群以及哨兵机制学习总结

Redis的主从集群以及哨兵机制 为什么要使用主从集群?部署主从集群主从集群怎么同步数据?数据同步的方式和时机实例查看主从数据同步原理增量同步潜在的问题主从集群的优化 主节点宕机怎么办?哨兵机制 为什么要使用主从集群? 我们…

【机器学习】机器学习的基本分类-强化学习(Reinforcement Learning, RL)

强化学习(Reinforcement Learning, RL)是一种基于试错的方法,旨在通过智能体与环境的交互,学习能够最大化累积奖励的策略。以下是强化学习的详细介绍。 强化学习的核心概念 智能体(Agent) 执行动作并与环境…

行政管理痛点解决方案:OA系统助力企业提效减负

作为企业行政管理的中枢,行政部门承担着企业运转的核心职责。从办公物资采购到会议室安排,从流程审批到企业文化建设,行政工作繁杂且细致。然而,在传统管理模式下,行政工作往往面临以下痛点: 流程繁琐&…

Flask内存马学习

文章目录 参考文章环境搭建before_request方法构造内存马after_request方法构造内存马errorhandler方式构造内存马add_url_rule方式构造内存马 参考文章 https://www.mewo.cc/archives/10/ https://www.cnblogs.com/gxngxngxn/p/18181936 前人栽树, 后人乘凉 大佬们太nb了, …

小红书关键词搜索采集 | AI改写 | 无水印下载 | 多维表格 | 采集同步飞书

小红书关键词搜索采集 | AI改写 | 无水印下载 | 多维表格 | 采集同步飞书 一、下载影刀: https://www.winrobot360.com/share/activity?inviteUserUuid595634970300317698 二、加入应用市场 https://www.yingdao.com/share/accede/?inviteKeyb2d3f22a-fd6c-4a…

(五)FT2232HL高速调试器之--三步实现STM32的VSCODE在线仿真工程搭建

对于单片机开发,rtthread studios 与 vscode,鱼与熊掌可以兼得否,其实是可以的,下面通过三个步骤,实现基于FT2232HL高速调试器的,stm32的VSCODE在线仿真工程的搭建。 1、软件下载与VSCODE插件安装配置 软…

【机器人】ATM 用于策略学习的任意点轨迹建模 RSS 2024 | 论文精读

文章提出了一种新的框架,名为Any-point Trajectory Modeling (ATM) ,称为任意点轨迹建模。 用于从视频中预测任意点的未来轨迹,从而在最少动作标签数据的情况下,学习稳健的视觉运动策略。 图中展示了三个案例,打开柜子…

linux----系统i/o

基本概念 在Linux系统中,I/O(Input/Output)即输入/输出,是操作系统与外部设备(如磁盘、终端、网络等)进行数据交互的机制。它涉及到从外部设备读取数据到内存(输入操作)&#xff0c…

Mac 开机 一闪框 mediasharingd

Mac 开机 一闪框一闪而过 mediasharingd ->系统偏好设置->共享->服务的复选框全部取消,保存。 重启解决。

纯前端实现更新检测

通过判断打包后的html文件中的js入口是否发生变化,进而实现前端的代码更新 为了使打包后的文件带有hash值,需要对vite打包进行配置 import { defineConfig } from vite; import vue from vitejs/plugin-vue; import { resolve } from path; import AutoI…

arcgisPro相接多个面要素转出为完整独立线要素

1、使用【面转线】工具,并取消勾选“识别和存储面邻域信息”,如下: 2、得到的线要素,如下:

基于SpringBoot+html+vue实现的林业产品推荐系统【源码+文档+数据库文件+包部署成功+答疑解惑问到会为止】

代码包运行启动成功!不管你有没有运行环境,哪怕你是刚买的新电脑,也包启动运行成功!有不懂的地方随便问!问到会为止! 【功能介绍】 基于SpringBootVue实现的林业产品推荐系统采用前后端分离的架构方式&…

【Java基础面试题024】Java中包装类型和基本类型的区别是什么?

回答重点 基本类型: Java中有8种基本数据类型(byte、short、int、long、float、double、char、boolean)他们是直接存储数值的变量,位于栈上(局部变量在栈上、成员变量在堆上,静态字段/类在方法区&#xf…

.net core在linux导出excel,System.Drawing.Common is not supported on this platform

使用框架 .NET7 导出组件 Aspose.Cells for .NET 5.3.1 asp.net core mvc 如果使用Aspose.Cells导出excel时,报错 : System.Drawing.Common is not supported on this platform 平台特定实现: 对于Windows平台,System.Drawing.C…

web自动化测试知识总结

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、自动化测试基本介绍 1、自动化测试概述: 什么是自动化测试?一般说来所有能替代人工测试的方式都属于自动化测试,即通过工…

怿星科技联合赛力斯举办workshop活动,进一步推动双方合作

12月18日,由怿星科技与赛力斯汽车联合举办的workshop活动在赛力斯五云湖总部展开,双方嘉宾围绕智能汽车发展趋势、行业前沿技术、汽车电子网络与功能测试等核心议题展开了深度对话与交流,并现场参观演示了多套前沿产品。怿星科技CEO潘凯、汽车…