Spring Boot Bean 注入的常用方式教程
Spring Boot Bean 注入是一种将依赖对象引入到应用程序组件中的机制,它有助于实现松耦合和可测试的代码。这种注入方式允许我们将依赖关系委托给 Spring 容器来管理,从而提高了代码的可维护性和可读性。Spring Boot 提供了多种 Bean 注入方式,包括构造函数注入、Setter 方法注入和字段注入等,以满足不同的需求和偏好。
Bean 注入的优势包括:
- 降低了代码的耦合度,使得组件更容易重用和测试。
- 提高了代码的可读性,减少了样板代码。
- Spring 容器可以负责管理 Bean 的生命周期,包括创建、初始化和销毁。
Spring Boot Bean 注入配置
在 Spring Boot 中,配置 Bean 注入可以通过多种方式完成,最常用的方式是使用注解。以下是一个简单的配置示例:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class MyService {private final MyRepository repository;@Autowiredpublic MyService(MyRepository repository) {this.repository = repository;}// ...
}
在上面的示例中,@Autowired注解用于构造函数,以实现构造函数注入。Spring Boot 会自动识别MyRepository类型的 Bean 并将其注入到MyService中。
其它常见注入配置
1、构造函数注入
这是一种常见的方式,通过在类的构造函数上使用@Autowired注解将依赖注入到 Bean 中。例如:
@Service
public class MyService {private final MyRepository repository;@Autowiredpublic MyService(MyRepository repository) {this.repository = repository;}
}
2、字段注入
你可以使用@Autowired注解直接在字段上注入依赖。这种方式通常用于小型项目或者在测试时注入模拟对象。
@Service
public class MyService {@Autowiredprivate MyRepository repository;
}
3、Setter 方法注入
通过在 Setter 方法上使用@Autowired注解来进行注入。
@Service
public class MyService {private MyRepository repository;@Autowiredpublic void setRepository(MyRepository repository) {this.repository = repository;}
}
4、使用@Qualifier注解
如果你有多个实现了同一接口的 Bean,可以使用@Qualifier注解指定要注入的 Bean 的名称或者 ID。
@Service
public class MyService {private final MyRepository repository;@Autowiredpublic MyService(@Qualifier("myRepositoryImpl") MyRepository repository) {this.repository = repository;}
}
5、构造函数注入的替代方式
除了使用@Autowired,你也可以使用@Inject注解来完成构造函数注入。
@Service
public class MyService {private final MyRepository repository;@Injectpublic MyService(MyRepository repository) {this.repository = repository;}
}
以上是一些常见的 Spring Boot Bean 注入方式,你可以根据自己的需求和项目的规模选择合适的方式。不过,最常用的方式是构造函数注入,因为它具有更好的可维护性和不变性。
实践案例
以下是一个简单的示例,演示了如何在 Spring Boot 项目中使用 Bean 注入。假设我们有一个简单的 REST API,它允许用户创建和获取书籍信息。
首先,我们需要创建一个BookService类,它依赖于BookRepository:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class BookService {private final BookRepository bookRepository;@Autowiredpublic BookService(BookRepository bookRepository) {this.bookRepository = bookRepository;}// ...
}
然后,我们创建一个BookController,它依赖于BookService:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/books")
public class BookController {private final BookService bookService;@Autowiredpublic BookController(BookService bookService) {this.bookService = bookService;}// ...
}
通过以上配置,Spring Boot 会自动注入BookRepository到BookService,并注入BookService到BookController,从而实现了依赖关系的管理。
使用 Apifox 测试和管理接口
Apifox 是一个比 Postman 更强大的接口测试工具,Apifox = Postman + Swagger + Mock + JMeter,Apifox 支持调试 http(s)、WebSocket、Socket、gRPC、Dubbo 等协议的接口,并且集成了 IDEA 插件。在开发完接口后,可以通过 Apifox 的 IDEA 插件一键自动生成接口文档,多端同步,非常方便测试和维护。

注意事项
在使用 Bean 注入时,需要注意以下事项:
- 确保目标 Bean 已经被正确配置并且可用。否则,会抛出依赖注入失败的异常。
- 避免循环依赖。Spring Boot 通常能够处理简单的循环依赖,但复杂的循环依赖可能导致应用程序启动失败。
- 谨慎使用字段注入,因为它可能导致不易测试的代码。构造函数或 Setter 方法注入通常更容易测试。
知识扩展:
- Spring Boot Bean 加载顺序的用法详解
- Spring Boot AOP 如何使用?
参考链接:
- Spring Boot 官方文档:Spring Boot
相关文章:
Spring Boot Bean 注入的常用方式教程
Spring Boot Bean 注入是一种将依赖对象引入到应用程序组件中的机制,它有助于实现松耦合和可测试的代码。这种注入方式允许我们将依赖关系委托给 Spring 容器来管理,从而提高了代码的可维护性和可读性。Spring Boot 提供了多种 Bean 注入方式,…...
Java项目调用Python脚本(基于idea)
前期准备 1.首先需要在本地环境中安装配置python环境 Python(含PyCharm及配置)下载安装以及简单使用(Idea) 博主本次使用python版本为py3.7.3 2.idea安装python插件 位置:File->Settings->Plugins->python->安装后重启即可 3.引入jython依赖 &l…...
前端 JS 经典:i,i++,++i区别
1. 概念 用于对变量进行自增操作。它们的区别在于返回值不同。 i 表示先使用 i 的值,再将 i 加 1,返回的是 i 自增前的值。 i 表示先将 i 加 1,再使用 i 的值,返回的是 i 自增后的值。 i 表示直接使用 i 的值,不进…...
EF Core 7.0 新特性之批量修改
概要 EF Core 7.0 提供了一个可以将LINQ查询和批量修改相结合的方法ExecuteUpdate。由于数据修改是以批量更新的方式完成,所以可以减少数据库的往返次数。 本文将主要介绍ExecuteUpdate的使用方法。 代码和实现 基本案例 本文我们使用银行分行,ATM机…...
Vue_Bug error0308010Cdigital envelope routinesunsupported
Bug描述: error0308010Cdigital envelope routinesunsupported 解决方法: Just add this to the top of vue.config.js : const crypto require(crypto);/*** md4 algorithm is not available anymore in NodeJS 17 (because of lib SSL 3).* In that…...
中科院提出“思维传播”,极大增强ChatGPT等模型复杂推理能力
中国科学院自动化研究所与耶鲁大学计算机系研究人员联合发布了,一份名为《思维传播:用大型语言模型进行基于类比的复杂推理》的论文。 ChatGPT等大型语言模型展示出了超强的创造能力,只需简单的文本提示就能生成小说、营销创意、简历等各种文本内容。但…...
ubuntu20.04安装opencv 3.2.0 报错
安装记录 Error 1: cmake时报错 CMake Error at cmake/OpenCVCompilerOptions.cmake:21 (else): A duplicate ELSE command was found inside an IF block. Fix: 修改opencv-3.2.0/cmake/OpenCVCompilerOptions.cmake文件 注释掉21和22行 else()message(STATUS "Unabl…...
KubeVela交付
有什么用我也不想说了,这个是k8s CI/CD,进阶玩家玩的了,比你们喜欢Arg CD更科学,更现代 在 Kubernetes 中安装 KubeVela helm repo add kubevela https://charts.kubevela.net/core helm repo update helm install --create-namespace -n v…...
【SpringCloud-10】SCA-nacos
前言: 前面介绍的springcloud,可以看做第一代,称为:SCN(spring cloud Netflix); 接下来介绍的是第二代:SCA(spring cloud alibaba); SCA主要有以下组件&#…...
卡顿分析与布局优化
卡顿分析与布局优化 大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性能。Android系统每隔大概16.6ms发出VSYNC信 号,触发对UI进行渲染,如果每次渲染都成功,这样就能够达到流畅的画面所需要的60fps,为了能够实现60fp…...
【Vivado HLS Bug】Ubuntu环境下Vivado HLS导出IP报错:HLS ERROR: [IMPL 213-28]
Export IP Invalid Argument / Revision Number Overflow Issue (Y2K22) (xilinx.com)一.问题描述: 在Ubuntu20.04环境中使用Vivado HLS导出IP时报错:HLS ERROR: [IMPL 213-28] 二.解决方法: 1.从如下链接中下载官方补丁Export IP Invalid…...
2022最新版-李宏毅机器学习深度学习课程-P14 批次(batch)与动量(momentum)
一、batch 回顾epoch、shuffle batch size大还是小?都有好处 大batchsize的好处 由于GPU有并行计算的能力,左边并不一定用时更长 反而是,batch size小的时候,要跑完一个epoch所用的update时间更长,所以时间方面的比较…...
谜题(Puzzle, ACM/ICPC World Finals 1993, UVa227)rust解法
有一个5*5的网格,其中恰好有一个格子是空的,其他格子各有一个字母。一共有4种指令:A, B, L, R,分别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指令序列(以数字0结束),输出指…...
acwing算法基础之数据结构--双链表
目录 1 知识点2 模板 1 知识点 一般的结构体写法为, struct BiListNode {int val;BiListNode *left;BiListNode *right; };但我们不用这个,而用数组模拟双链表,此时,用编号为0的结点表示头结点,用编号为1的结点表示尾…...
将中文名格式化输出为英文名
要求: 编写Java程序,输入样式为:Zhong wen ming的人名,以 Ming,Zhong.W 的形式打印出来。其中.W是中间单词的首字母;例如输入”Willian Jefferson Clinton“,输出形式为:Clinton,Willian.J public static …...
设计模式_迭代器模式
迭代器模式 介绍 设计模式定义案例迭代器模式行为型:关注对象与行为的分离 提供了一种统一的方式来访问多个不同的集合两个集合:使用了不同的数据存储方式 学生 和 警察 查询显示出集合的内容 ,使用相同的代码 问题堆积在哪里解决办法不同…...
【数据结构】:栈的实现
1 栈 1.1栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则 压栈…...
微前端一:技术选型
微前端是一种多个团队通过独立发布功能的方式来共同构建现代化 web 应用的技术手段及方法策略。 微前端架构具备以下几个核心价值: 1、技术栈无关 主框架不限制接入应用的技术栈,微应用具备完全自主权 2、独立开发、独立部署 微应用仓库独立࿰…...
FPGA project : flash_continue_write
本实验学习了通过spi通信协议,驱动flash;完成连续写操作。 连续写: 本质上还是页编程指令,两种连续写的方式: 1,每次只写1byte的数据。 2,每次写满1页数据,计算剩余数据够不够写…...
论文阅读:Rethinking Range View Representation for LiDAR Segmentation
来源ICCV2023 0、摘要 LiDAR分割对于自动驾驶感知至关重要。最近的趋势有利于基于点或体素的方法,因为它们通常产生比传统的距离视图表示更好的性能。在这项工作中,我们揭示了建立强大的距离视图模型的几个关键因素。我们观察到,“多对一”…...
Linux系统auditd审计服务实战:从零配置到规则优化(附常用命令大全)
Linux系统auditd审计服务实战:从零配置到规则优化(附常用命令大全) 当服务器遭遇入侵时,大多数管理员的第一反应往往是查看历史命令记录。但现实情况是,黑客通常会第一时间清空.bash_history文件。这时,一个…...
LCDGraph:基于字符屏CGRAM的嵌入式轻量级实时绘图库
1. 项目概述LCDGraph 是一款专为嵌入式系统设计的轻量级图形绘制库,面向资源受限的微控制器平台(如 Arduino 系列),核心目标是在标准字符型 LCD 显示屏上实现高效、低开销的实时线性数据可视化。它不依赖图形点阵驱动或外部显存&a…...
3步实现Axure RP 9-11全版本零障碍汉化:从诊断到优化的全方位解决方案
3步实现Axure RP 9-11全版本零障碍汉化:从诊断到优化的全方位解决方案 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包,不定期更新。支持 Axure 9、Axure 10。 项目地址: https://gitcode.com/gh_mirrors/ax/…...
如何用Python处理杭州交通数据集?从roadnet.json到flow.json的完整解析指南
杭州交通数据实战:用Python解析roadnet.json与flow.json的进阶技巧 第一次接触杭州交通数据集时,我被roadnet.json里密密麻麻的交叉点坐标和flow.json中流动的车辆轨迹震撼到了——这哪是数据文件,分明是一座数字孪生城市的血管与血液。作为算…...
Python中数据分块处理的实现方法
在实际的数据处理任务中,我们经常需要处理大规模数据集。一次性加载所有数据到内存可能会导致内存溢出,这时数据分块处理就显得尤为重要。本文将介绍Python中三种高效的数据分块处理方法。 一、为什么需要数据分块处理? 在处理大型数据集时…...
【C++ 面试突击 · 06】大厂高频面试题:从 decltype 类型推导到 volatile 内存屏障解析
目录 1. C中的 decltype 关键字是什么? 2. C中的 volatile 关键字是什么? 3. C中的友元函数是否破坏了封装性? 4. C中的 mutable 关键字是什么? 5. mutable 关键字有哪些实际用途? 6. 如何在 C 中避免内存碎片问…...
Blaze分块计算优化技巧:5个方法提升大数据处理性能
Blaze分块计算优化技巧:5个方法提升大数据处理性能 【免费下载链接】blaze NumPy and Pandas interface to Big Data 项目地址: https://gitcode.com/gh_mirrors/bl/blaze Blaze是一个强大的大数据处理工具,它通过分块计算技术为NumPy和Pandas提供…...
敏捷开发实战指南:提升团队效率的5个秘诀
在快速迭代的敏捷开发中,测试团队既是质量守门人,也是流程加速器。本文从软件测试从业者的专业视角,提炼五个经过实战验证的高效实践,助力团队突破协作瓶颈、缩短反馈周期,实现质量与速度的双重提升。秘诀一࿱…...
告别样本不平衡噩梦:Focal Loss 让你的模型学会“划重点”
我说的不是 Python 那个 HTTPX 客户端,而是 ProjectDiscovery 出的 httpx。官方对它的定义很直接: 一个高性能、面向多探针的 HTTP 工具包支持高并发下对 URL、主机、CIDR 等 目标做 HTTP 层探测,并尽量保证结果稳定性。 它本质上不是漏洞扫描…...
大疆无人机GB28181协议接入异常深度排查与系统性解决方案
大疆无人机GB28181协议接入异常深度排查与系统性解决方案 【免费下载链接】wvp-GB28181-pro 项目地址: https://gitcode.com/GitHub_Trending/wv/wvp-GB28181-pro 问题定位:从日志特征解析接入故障 在WVP-GB28181-Pro平台集成大疆Mavic 3E无人机过程中&…...
