当前位置: 首页 > news >正文

【Spring】注入方式

介绍

在Spring框架中,依赖注入(Dependency Injection, DI)是实现控制反转(Inversion of Control, IoC)的核心机制。

除了通过XML配置的注入方式(已逐渐被淘汰),Spring还支持多种基于注解和Java配置的注入方式。以下是常见的注入方式:

 构造方法注入(Constructor Injection)

  • 描述:通过构造方法将依赖注入到Bean中。

  • 优点

    • 强制依赖,确保Bean在创建时就拥有所有必需的依赖。

    • 适合不可变对象(属性可以声明为final)。

    • 线程安全。

  • 使用场景:推荐用于强依赖的场景。

  • 示例

    @Component
    public class DemoService {private final DemoRepository repository;// 从Spring 4.3开始,如果只有一个构造方法,可以省略@Autowired@Autowired public DemoService(DemoRepository repository) {this.repository = repository;}
    }

Setter方法注入(Setter Injection)

  • 描述:通过Setter方法将依赖注入到Bean中。

  • 优点

    • 灵活性高,可以在对象创建后动态修改依赖。

    • 适合可选依赖。

  • 使用场景:适合依赖是可选的或需要动态修改的场景。

  • 示例

@Component
public class DemoService {private DemoRepository repository;@Autowiredpublic void setRepository(DemoRepository repository) {this.repository = repository;}
}

字段注入(Field Injection)

  • 描述:直接在字段上使用@Autowired注解注入依赖。

  • 优点

    • 代码简洁,无需编写构造方法或Setter方法。

  • 缺点

    • 依赖关系不明确,难以测试(无法通过构造方法或Setter方法注入Mock对象)。

    • 违反了单一职责原则,隐藏了类的依赖关系。

  • 使用场景:适合简单的场景,但不推荐在生产代码中使用。

  • 示例

@Component
public class DemoService {@Autowiredprivate DemoRepository repository;
}

方法注入(Method Injection)

  • 描述:通过任意方法注入依赖,方法可以是普通方法或Bean生命周期回调方法(如@PostConstruct)。

  • 优点

    • 灵活性高,可以在方法中执行额外的逻辑。

  • 使用场景:适合需要在注入时执行额外逻辑的场景。

  • 示例

@Component
public class DemoService {private DemoRepository repository;@Autowiredpublic void setupRepository(DemoRepository repository) {this.repository = repository;// 可以在这里执行其他逻辑}
}

接口注入(Interface Injection)

  • 描述:通过实现特定接口来注入依赖。Spring本身并不直接支持这种方式,但可以通过自定义接口和AOP实现。

  • 优点

    • 高度灵活,适合需要动态注入的场景。

  • 缺点

    • 实现复杂,代码侵入性强。

  • 使用场景:适合需要高度自定义注入逻辑的场景。

  • 示例

public interface RepositoryAware {void setRepository(DemoRepository repository);
}@Component
public class DemoService implements RepositoryAware {private DemoRepository repository;@Overridepublic void setRepository(DemoRepository repository) {this.repository = repository;}
}

注解注入(Annotation-based Injection)

  • 描述:通过注解(如@Autowired@Resource@Inject)实现依赖注入。

  • 优点

    • 代码简洁,易于使用。

    • 支持多种注入方式(构造方法、Setter方法、字段等)。

  • 使用场景:适合大多数基于注解的依赖注入场景。

  • 示例

@Component
public class DemoService {@Autowiredprivate  DemoRepository repository;}

Java配置注入(Java Configuration Injection)

  • 描述:通过@Configuration类和@Bean方法显式配置依赖注入。

  • 优点

    • 完全基于Java代码,无需XML配置。

    • 适合需要复杂逻辑的依赖配置。

  • 使用场景:适合需要显式控制Bean创建和依赖注入的场景。

  • 示例

@Configuration
public class DemoConfig {@Beanpublic DemoRepository demoRepository() {return new DemoRepository();}@Beanpublic DemoService demoService() {return new DemoService(demoRepository());}
}

Lookup方法注入(Lookup Method Injection)

  • 描述:通过@Lookup注解或<lookup-method>标签实现方法级别的依赖注入,通常用于注入原型(Prototype)Bean到单例(Singleton)Bean中。

  • 优点

    • 解决单例Bean中注入原型Bean的问题。

  • 使用场景:适合需要每次调用方法时返回不同实例的场景。

  • 示例

@Component
public abstract class DemoService {@Lookuppublic abstract DemoPrototypeBean getPrototypeBean();public void doSomething() {DemoPrototypeBean bean = getPrototypeBean();// 使用bean}}

总结

Spring提供了多种依赖注入方式,每种方式都有其适用场景和优缺点。以下是推荐的使用方式:

  • 推荐:构造方法注入(强制依赖、线程安全、不可变性)。

  • 可选:Setter方法注入(适合可选依赖或动态修改依赖)。

  • 不推荐:字段注入(代码简洁但隐藏依赖关系,难以测试)。

  • 特殊场景:方法注入、接口注入、Lookup方法注入等适合特定需求。




相关文章:

【Spring】注入方式

介绍 在Spring框架中&#xff0c;依赖注入&#xff08;Dependency Injection, DI&#xff09;是实现控制反转&#xff08;Inversion of Control, IoC&#xff09;的核心机制。 除了通过XML配置的注入方式&#xff08;已逐渐被淘汰&#xff09;&#xff0c;Spring还支持多种基…...

Python 中的作用域:规则与应用

在 Python 编程中&#xff0c;作用域&#xff08;Scope&#xff09; 是指一个变量可以被访问和引用的范围。作用域与变量的生命周期密切相关&#xff0c;决定了变量何时被创建、何时被销毁以及在哪些地方可以使用它。理解作用域对于编写清晰、可维护的代码至关重要。 Python 中…...

T-SQL语言的字符串处理

T-SQL语言的字符串处理 引言 在数据库管理和应用开发中&#xff0c;我们经常需要对字符串进行处理。字符串的处理包括查找、替换、分割、拼接以及格式化等操作&#xff0c;而这些操作在SQL Server中可以通过T-SQL&#xff08;Transact-SQL&#xff09;来实现。T-SQL是微软SQL…...

宇航用VIRTEX5系列FPGA的动态刷新方法及实现

SRAM型FPGA在宇航领域有广泛的应用&#xff0c;为解决FPGA在空间环境中的单粒子翻转问题&#xff0c;增强设计的可靠性&#xff0c;本文介绍一种低成本的抗辐照解决方案。该方案从外置高可靠存储器中读取配置数据&#xff0c;通过定时刷新结合三模冗余的方式消除单粒子影响&…...

Flink提交任务通过Kerberos认证

Flink提交任务通过Kerberos认证 Clouera官网地址&#xff1a; https://docs.cloudera.com/csa/1.7.0/security/topics/csa-securing-jobs.html Securing Apache Flink jobs flink run -d -p 2 \ -yD security.kerberos.login.keytabtest.keytab \ -yD security.kerberos.lo…...

【linux】文件与目录命令 - cp

文章目录 1. 基本用法2. 常用参数3. 用法举例4. 注意事项 cp 命令用于复制文件或目录&#xff0c;支持单个文件复制、多文件复制以及目录的递归复制&#xff0c;是 Linux 系统中常用的文件管理命令之一。 1. 基本用法 语法&#xff1a; cp [选项] 源文件 目标文件 cp [选项] …...

鸿蒙--登入案例

实现要求&#xff1a; 在账户和密码的输入框输入账号或密码时&#xff0c;提交按钮下方同步出现输入的账户和密码 Entry Component struct login {State username:string State password:string build() {Column(){// 图标Image($r(app.media.app_icon)).width(100).height(…...

【JavaWeb】EL表达式

目录 1.EL表达式概述 2.EL表达式运算 3.EL表达式操作对象 4.EL表达式内置对象 4.1.参数隐藏对象 4.2.域隐藏对象 4.3.PageContext对象 1.EL表达式概述 EL&#xff08;Expression Language&#xff09;是一门表达式语言&#xff0c;它对应<% ... %>。在JSP中&…...

Angular由一个bug说起之十三:Cross Origin

跨域 想要了解跨域&#xff0c;首要要了解源 什么是源&#xff0c;源等于协议加域名加端口号 只有这三个都相同&#xff0c;才是同源&#xff0c;反之则是非同源。 比如下面这四个里&#xff0c;只有第4个是同源 而浏览器给服务器发送请求时&#xff0c;他们的源一样&#xff0…...

WEB前端-2

目录 HTML-常见的网页标签-分类2 语义化标签 列表标签 表单标签 form标签 input标签 select标签 textarea标签 html转义符 h5提供的新标签 【例3&#xff1a;豆瓣电影】 【源码】 【例4&#xff1a;登录注册】 【源码】 【例5&#xff1a;QQ注册】 【源码】 H…...

高斯混合模型 (Gaussian Mixture Model, GMM) 算法详解与PyTorch实现

高斯混合模型 (Gaussian Mixture Model, GMM) 算法详解与PyTorch实现 目录 高斯混合模型 (Gaussian Mixture Model, GMM) 算法详解与PyTorch实现1. 高斯混合模型 (GMM) 算法概述1.1 高斯分布1.2 GMM的优势2. GMM的核心技术2.1 模型定义2.2 参数估计2.3 损失函数3. PyTorch实现G…...

web作业

作业一 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>Document</title> </head&g…...

Tauri教程-基础篇-第一节 Tauri项目创建及结构说明

“如果结果不如你所愿&#xff0c;就在尘埃落定前奋力一搏。”——《夏目友人帐》 “有些事不是看到了希望才去坚持&#xff0c;而是因为坚持才会看到希望。”——《十宗罪》 “维持现状意味着空耗你的努力和生命。”——纪伯伦 Tauri 技术教程 * 第四章 Tauri的基础教程 第一节…...

计算机网络之---物理层标准与协议

常见的物理层标准 1. IEEE 802 标准 IEEE 802 是一系列定义局域网和城域网通信协议的标准&#xff0c;其中许多标准涉及到物理层的技术细节&#xff1a; IEEE 802.3 (Ethernet)&#xff1a;定义了以太网的物理层规范&#xff0c;规定了如何通过电缆&#xff08;例如同轴电缆…...

Idea日志乱码

问题描述 前提&#xff1a;本人使用windows Idea运行sh文件&#xff0c;指定了utf-8编码&#xff0c;但是运行过程中还是存在中文乱码 Idea的相关配置都已经调整 字体调整为雅黑 文件编码均调整为UTF-8 调整Idea配置文件 但是还是存在乱码&#xff0c;既然Idea相关配置已经…...

tk GMV MAX素材范围投放指南

Product GMy Max素材范围说明 Product GMy Max能自动获取带有相关商品锚点链接&#xff08;无论是单个锚点还是多个锚点&#xff09;的视频&#xff0c;并将其用于推广特定商品的广告素材&#xff0c;前提是这些视频已经获得广告授权。然而&#xff0c;请注意&#xff0c;多个…...

TANGO - 数字人全身动作生成

文章目录 一、关于 TANGO演示视频&#xff08;YouTube&#xff09;&#x1f4dd;发布计划 二、⚒️安装克隆存储库构建环境 三、&#x1f680;训练和推理1、推理2、为自定义字符创建图形 一、关于 TANGO TANGO 是 具有分层音频运动嵌入 和 扩散插值的共语音手势视频再现 由东…...

springboot集成整合工作流,activiti审批流,整合实际案例,流程图设计,流程自定义,表单配置自定义,代码demo流程

前言 activiti工作流引擎项目&#xff0c;企业erp、oa、hr、crm等企事业办公系统轻松落地&#xff0c;一套完整并且实际运用在多套项目中的案例&#xff0c;满足日常业务流程审批需求。 一、项目形式 springbootvueactiviti集成了activiti在线编辑器&#xff0c;流行的前后端…...

Windows 10 ARM工控主板连接I2S音频芯片

在Windows工控主板应用中&#xff0c;音频功能是一项基本的需求&#xff0c;USB声卡在x86/x64 Windows系统上就可直接免驱使用&#xff0c;但这些USB声卡通常不提供ARM上的Windows系统驱动。本文将介绍如何利用安装在ARM上的Windows工控主板——ESM8400的I2S接口、连接WM8960音…...

单元测试MockitoExtension和SpringExtension

1. MockitoExtension MockitoExtension 是 JUnit 5 提供的一个扩展&#xff0c;用于支持 Mockito 的集成。它可以自动初始化标记为 Mock、InjectMocks 等的 Mockito 对象&#xff0c;而不需要显式调用 MockitoAnnotations.initMocks(this)。 主要特点: 自动初始化 Mock、Spy…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…...

Matlab实现任意伪彩色图像可视化显示

Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中&#xff0c;如何展示好看的实验结果图像非常重要&#xff01;&#xff01;&#xff01; 1、灰度原始图像 灰度图像每个像素点只有一个数值&#xff0c;代表该点的​​亮度&#xff08;或…...

LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考

目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候&#xff0c;显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...

Java设计模式:责任链模式

一、什么是责任链模式&#xff1f; 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09; 是一种 行为型设计模式&#xff0c;它通过将请求沿着一条处理链传递&#xff0c;直到某个对象处理它为止。这种模式的核心思想是 解耦请求的发送者和接收者&#xff0c;…...

Python爬虫(52)Scrapy-Redis分布式爬虫架构实战:IP代理池深度集成与跨地域数据采集

目录 一、引言&#xff1a;当爬虫遭遇"地域封锁"二、背景解析&#xff1a;分布式爬虫的两大技术挑战1. 传统Scrapy架构的局限性2. 地域限制的三种典型表现 三、架构设计&#xff1a;Scrapy-Redis 代理池的协同机制1. 分布式架构拓扑图2. 核心组件协同流程 四、技术实…...