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 不再是一…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
