SpringBoot的Bean类三种注入方式(附带LomBok注入)
SpringBoot的Bean类三种注入方式(附带LomBok注入)
在 Spring Boot 中,Bean 的注入方式主要包括构造函数注入(Constructor Injection)、字段注入(Field Injection)以及 Setter 方法注入(Setter Injection)。每种注入方式都有其特点和适用场景。此外,Lombok 提供了一种简化依赖注入的方式,能够减少样板代码,提高开发效率。以下是这几种注入方式的详细介绍,并附上 Lombok 的注入方式。
1. 构造函数注入(Constructor Injection)
使用场景:构造函数注入是 Spring 官方推荐的首选依赖注入方式,特别适用于强制性依赖项的注入。它确保了所有必需的依赖项在对象创建时就已经存在,并且一旦对象被创建后,这些依赖项就不能再被更改,从而保证了对象状态的一致性和不可变性。构造函数注入还可以帮助解决循环依赖的问题,因为 Spring 会在检测到循环依赖时抛出异常,迫使开发者解决这个问题。
@Service
public class MyService {private final MyRepository repository;@Autowired // 可选,Spring 4.3+ 版本中可以省略public MyService(MyRepository repository) {this.repository = repository;}// ...
}
构造函数注入的一个显著优势在于它可以与 final 关键字结合使用,使得依赖项成为不可变的属性,增强了代码的安全性和可读性。对于那些需要确保依赖项在整个对象生命周期内都不会改变的场景,构造函数注入是非常理想的选择。
2. 字段注入(Field Injection)
使用场景:字段注入是一种简单直接的方式,通过在类的私有字段上添加 @Autowired 注解来实现依赖注入。这种方式的优点在于代码简洁,易于阅读,特别适合于小型项目或原型开发阶段。然而,字段注入也存在一些潜在的风险,比如可能导致空指针异常,因为它允许对象在未完全初始化的情况下被使用。此外,字段注入还可能引发循环依赖的问题,并且不利于单元测试,因为无法轻松地为依赖项提供模拟实现。
@Service
public class MyService {@Autowiredprivate MyRepository repository;// ...
}
尽管字段注入在某些情况下非常方便,但它并不是最佳实践,尤其是在大型项目中,应该尽量避免使用字段注入,转而采用更加安全可靠的构造函数注入或 Setter 方法注入。
3. Setter 方法注入(Setter Injection)
使用场景:Setter 方法注入允许通过调用类中的 Setter 方法来设置依赖项,通常用于非强制性依赖项的注入。这种方式提供了更大的灵活性,因为它允许在对象创建之后重新配置或更新依赖项。这对于那些需要动态调整依赖关系的场景非常有用,例如,在应用程序运行期间根据用户输入或其他外部条件来改变某些行为。不过,Setter 方法注入也有一定的局限性,比如它可能会导致对象处于不完整的状态,直到所有的 Setter 方法都被调用为止。
@Service
public class MyService {private MyRepository repository;@Autowiredpublic void setRepository(MyRepository repository) {this.repository = repository;}// ...
}
Setter 方法注入的一个重要优点是它支持多参数的依赖注入,当一个类有多个依赖项时,使用 Setter 方法注入可以使代码更加清晰易懂。此外,Setter 方法注入还允许在不修改现有代码的情况下添加新的依赖项,这对于维护和扩展已有系统非常重要。
4. 使用 Lombok 进行依赖注入
使用场景:Lombok 是一款流行的 Java 库,旨在减少样板代码,提高开发效率。它可以通过注解自动生成常见的 getter、setter、构造函数等方法,从而简化依赖注入的过程。Lombok 支持两种主要的依赖注入方式:构造函数注入和 Setter 方法注入。使用 Lombok 可以显著减少手动编写重复代码的工作量,使代码更加简洁明了。
构造函数注入
Lombok 提供了 @RequiredArgsConstructor 注解,它可以为所有 final 或者带有 @NonNull 标记但未初始化的字段生成一个构造函数。这个构造函数会自动带上 @Autowired 注解,从而实现依赖注入。这种方式不仅减少了代码量,还保持了构造函数注入的安全性和不可变性特性。
@Service
@RequiredArgsConstructor(onConstructor_ = @__(@Autowired)) // 适用于 Spring 4.3 以下版本
// 对于 Spring 4.3 及以上版本可以直接使用 @RequiredArgsConstructor
public class MyService {private final MyRepository repository;
}
Setter 方法注入
Lombok 也支持通过 @Setter 注解来自动生成 Setter 方法,并且可以在生成的 Setter 方法上自动添加 @Autowired 注解。这种方式特别适合那些需要在对象创建后动态调整依赖关系的场景。不过,需要注意的是,Setter 方法注入可能会导致对象处于不完整状态的风险,因此应谨慎使用。
@Service
@Setter(onMethod_ = @Autowired)
public class MyService {private MyRepository repository;
}
总结
综上所述,构造函数注入、字段注入和 Setter 方法注入各有优劣,适用于不同的场景。构造函数注入因其安全性、不可变性和对循环依赖的有效处理而成为首选;字段注入虽然简单但存在风险,更适合快速开发和小型项目;Setter 方法注入则提供了额外的灵活性,适合那些需要动态调整依赖关系的应用程序。Lombok 的引入进一步简化了依赖注入的过程,减少了样板代码,提高了开发效率。开发者应当根据项目的具体需求和个人偏好,合理选择最适合的注入方式。值得注意的是,随着 Spring 框架的发展,官方越来越倾向于推荐构造函数注入,因为它能够更好地满足现代软件开发的最佳实践。
相关文章:
SpringBoot的Bean类三种注入方式(附带LomBok注入)
SpringBoot的Bean类三种注入方式(附带LomBok注入) 在 Spring Boot 中,Bean 的注入方式主要包括构造函数注入(Constructor Injection)、字段注入(Field Injection)以及 Setter 方法注入…...
开源向量数据库介绍说明
开源向量数据库 Milvus 特点:分布式、高性能,支持亿级向量检索。 支持的数据类型:文本、图像、音频、视频等。 使用场景:推荐系统、语义搜索、图像搜索。 数据存储后端:支持多种后端,如 SQLite、MySQL、Pos…...
【前端】深度解析 JavaScript 中的 new 关键字与构造函数
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 💯前言💯构造函数的核心特性💯new 关键字的执行机制💯实例代码与详细解析代码示例代码逐步解析 💯new 的内部执行模拟执行过程的详细解析 &am…...
2024年华中杯数学建模C题基于光纤传感器的平面曲线重建算法建模解题全过程文档及程序
2024年华中杯数学建模 C题 基于光纤传感器的平面曲线重建算法建模 原题再现 光纤传感技术是伴随着光纤及光通信技术发展起来的一种新型传感器技术。它是以光波为传感信号、光纤为传输载体来感知外界环境中的信号,其基本原理是当外界环境参数发生变化时,…...
使用 `typing_extensions.TypeAlias` 简化类型定义:初学者指南
使用 typing_extensions.TypeAlias 简化类型定义:初学者指南 什么是 TypeAlias?安装 typing_extensions示例代码:如何使用 TypeAlias示例 1:为简单类型定义别名示例 2:为复杂类型定义别名示例 3:结合 Union…...
如何快速批量把 PDF 转为 JPG 或其它常见图像格式?
在某些特定场景下,将 PDF 转换为 JPG 图片格式却具有不可忽视的优势。例如,当我们需要在不支持 PDF 查看的设备或软件中展示文档内容时,JPG 图片能够轻松被识别和打开;此外,对于一些网络分享或社交媒体发布的需求&…...
如何在组织中塑造和强化绩效文化?
在组织中塑造和强化绩效文化是一个系统性的工程。 一、明确绩效目标与期望 设定清晰目标 组织应根据自身战略规划,将长期目标分解为具体、可衡量、可实现、相关联、有时限(SMART)的短期和中期绩效目标。例如,一家连锁餐饮企业的…...
OllyDbg、CE简单介绍
基础知识: 想要破解软件,需要一些基础知识: 文件格式:Windows对应PE、Linux对应ELF、IOS对应Mash-0。文件格式是指操作系统规定的每个段(代码段、数据段、堆、栈)的大小、顺序等信息。 汇编语言࿱…...
Python函数——函数的返回值定义语法
一、引言 在Python中,函数的返回值是其核心功能之一,它使得函数能够将计算结果传递给调用者,进而推动程序的逻辑和功能实现。理解和掌握函数的返回值语法,不仅能够提高代码的模块化和可读性,还能使程序更加高效和灵活…...
【Pandas】pandas isna
Pandas2.2 General Top-level missing data 方法描述isna(obj)用于检测数据中的缺失值isnull(obj)用于检测数据中的缺失值notna(obj)用于检测数据中的非缺失值notnull(obj)用于检测数据中的非缺失值 pandas.isna() pandas.isna() 是 Pandas 库中的一个函数,用于…...
mysql 数据库表的大小
mysql 数据库表的大小 Mysql 查看数据库各个表占用空间 mysql如何查看数据库所有表大小 在MySQL中,要查看数据库所有表的大小,可以使用以下方法: 方法一:使用information_schema数据库 首先,通过命令行或图形界面…...
(6)JS-Clipper2之ClipperOffset
1. 描述 ClipperOffset类封装了对打开路径和关闭路径进行偏移(膨胀/收缩)的过程。 这个类取代了现在已弃用的OffsetPaths函数,该函数不太灵活。可以使用不同的偏移量(增量)多次调用Execute方法,而不必重新分配路径。现在可以在一次操作中对开放和封闭路…...
如何在Ubuntu中利用repo和git地址下载获取imx6ull的BSP
01-设置git的用户名和邮箱 git config --global user.name "suwenhao" git config --global user.email "2487872782qq.com"这里不设置的话后面在第5步的repo配置中还是会要求输入,而且以后进行相关操作都要输入,不妨现在就进行配置…...
Ruby On Rails 笔记5——常用验证下
3.Validation Options 3.1 :allow_nil 当验证值为nil时:allow_nil选项会跳过验证 class Coffee < ApplicationRecordvalidates :size, inclusion: { in: %w(small medium large),message: "%{value} is not a valid size" }, allow_nil: true end irb> Cof…...
JS听到了因果的回响
这是我学习JS的第11天了,,,我现在赶着周末学JS,然后还有二十多天就期末了呵呵呵。。。 图片切换模块 思路分析: 这是实现的代码,建议还是把不同的变量定义出来比较合适: //获取三个盒子// 小盒…...
【高中生讲机器学习】28. 集成学习之 Bagging 随机森林!
创建时间:2024-12-09 首发时间:2024-12-09 最后编辑时间:2024-12-09 作者:Geeker_LStar 嘿嘿,你好呀!我又来啦~~ 前面我们讲完了集成学习之 Boooooosting,这篇我们来看看集成学习的另一个分支…...
硬件设计 | Altium Designer软件PCB规则设置
基于Altium Designer(24.9.1)版本 嘉立创PCB工艺加工能力范围说明-嘉立创PCB打样专业工厂-线路板打样 规则参考-嘉立创 注意事项 1.每次设置完规则参数都要点击应用保存 2.每次创建PCB,都要设置好参数 3.可以设置默认规则,将…...
【Elasticsearch】实现用户行为分析
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
python字符串处理基础操作总结
1.去掉空格或者特殊符号 input_str.strip() #去掉所有空格 input_str.lstrip() #去掉左边空格 input_str.rstrip() #去掉右边空格 def print_hi():input_str 今天天气不错,风和日丽 out input_str.strip()print(input_str)print(out)if __name__ __main__:print…...
电子商务人工智能指南 6/6 - 人工智能生成的产品图像
介绍 81% 的零售业高管表示, AI 至少在其组织中发挥了中等至完全的作用。然而,78% 的受访零售业高管表示,很难跟上不断发展的 AI 格局。 近年来,电子商务团队加快了适应新客户偏好和创造卓越数字购物体验的需求。采用 AI 不再是一…...
别再死记硬背了!用‘神经元工作原理’理解你背单词为什么总忘
别再死记硬背了!用‘神经元工作原理’理解你背单词为什么总忘 背单词时总是前脚记后脚忘?这其实不是记忆力的问题,而是方法的问题。我们的大脑就像一台精密的生物计算机,而记忆的形成和巩固遵循着特定的神经科学规律。理解这些规…...
Pi0在物流分拣中的应用:智能包裹识别系统
Pi0在物流分拣中的应用:智能包裹识别系统 1. 物流分拣的现实挑战与技术破局点 每天清晨,当第一辆货车驶入分拣中心,成千上万的包裹开始在传送带上流动。它们来自不同电商平台、尺寸各异、包装材质多样,有的贴着模糊的条码&#…...
从零学习Kafka:数据存储
下载好之后,进行解压并进入到对应的目录。tar -xzf kafka_2.13-4.1.1.tgz cd kafka_2.13-4.1.1接着我们执行下面两条命令进行一些必要的配置。KAFKA_CLUSTER_ID"$(bin/kafka-storage.sh random-uuid)"bin/kafka-storage.sh format --standalone -t $KAFKA…...
墨语灵犀处理时序数据实战:基于LSTM的预测模型辅助开发
墨语灵犀处理时序数据实战:基于LSTM的预测模型辅助开发 最近在做一个销量预测的项目,团队里新来的同事看着一长串的时序数据和复杂的LSTM模型代码,有点无从下手。他问我:“这些参数到底该怎么调?预测出来的曲线波动这…...
StarVCenter单机版安装避坑指南:从BIOS设置到虚拟机创建的完整流程
StarVCenter单机版安装全流程实战:从硬件准备到虚拟机管理的深度解析 在当今企业IT基础设施快速迭代的背景下,虚拟化技术已成为资源整合与管理的核心解决方案。StarVCenter作为一款国产化虚拟化管理平台,其单机版部署方案特别适合中小型业务场…...
Wonder3D:从单张图片生成3D模型的终极指南
Wonder3D:从单张图片生成3D模型的终极指南 【免费下载链接】Wonder3D Single Image to 3D using Cross-Domain Diffusion 项目地址: https://gitcode.com/gh_mirrors/wo/Wonder3D Wonder3D是一款革命性的AI工具,能够在短短2-3分钟内将单张2D图片转…...
Qwen2.5-VL多模态大模型实战:如何用3090显卡高效部署7B版本(附避坑指南)
Qwen2.5-VL多模态大模型实战:3090显卡高效部署7B版本全攻略 当多模态大模型遇上消费级显卡天花板RTX 3090,会产生怎样的化学反应?作为目前最具性价比的24GB显存解决方案,3090显卡在部署7B参数规模的Qwen2.5-VL时既充满可能又暗藏…...
calibre-do-not-translate-my-path技术解析:解决中文路径翻译问题的本地化方案实践指南
calibre-do-not-translate-my-path技术解析:解决中文路径翻译问题的本地化方案实践指南 【免费下载链接】calibre-do-not-translate-my-path Switch my calibre library from ascii path to plain Unicode path. 将我的书库从拼音目录切换至非纯英文(中文…...
智能家居新视野:LingBot-Depth让机器人看懂复杂室内场景
智能家居新视野:LingBot-Depth让机器人看懂复杂室内场景 1. 引言:当机器人走进真实家庭环境 想象一下,你刚买的家用机器人第一次进入客厅时的场景:阳光透过窗帘在地板上投下斑驳的光影,茶几上的玻璃杯反射着吊灯的光…...
Qwen3Guard-Gen-8B真实案例:如何用AI模型自动拦截不当言论
Qwen3Guard-Gen-8B真实案例:如何用AI模型自动拦截不当言论 1. 引言:内容安全的新挑战 在数字内容爆炸式增长的今天,各类平台都面临着内容审核的巨大压力。传统的关键词过滤和规则匹配系统已经难以应对日益复杂的网络环境,特别是…...
