深入解析:Spring依赖注入方式

news/2025/10/12 8:08:02/文章来源:https://www.cnblogs.com/wzzkaifa/p/19136232

依赖注入方式

Spring框架主要支持以下三种依赖注入方式:构造器注入、Setter方法注入和字段注入。每种方式有各自的特点和适用场景。

构造器注入

通过类的构造器实现依赖注入,Spring容器在创建Bean实例时传入依赖对象。

特点

  • 强依赖性:适合必须依赖的场景,避免对象状态不完整。
  • 不可变性:注入后依赖不可变,适合final字段。
  • 线程安全:对象创建后依赖关系不再变化。

优点

  • 明确依赖关系,便于单元测试。
  • 避免循环依赖问题。
  • 符合不可变对象设计原则。

缺点

  • 参数较多时代码冗长。

示例

@Service
public class UserService {private final UserRepository userRepository;@Autowiredpublic UserService(UserRepository userRepository) {this.userRepository = userRepository;}
}
Setter方法注入

通过setter方法实现依赖注入,Spring容器调用setter方法传入依赖对象。

特点

  • 可选依赖:适合非必须依赖的场景。
  • 可重新注入:允许运行时重新配置依赖。

优点

  • 灵活性高,便于动态更换依赖。
  • 代码可读性好,参数多时更清晰。

缺点

  • 对象状态可能在生命周期中变化。
  • 可能隐藏依赖关系,导致NPE风险。

示例

@Service
public class OrderService {private PaymentService paymentService;@Autowiredpublic void setPaymentService(PaymentService paymentService) {this.paymentService = paymentService;}
}
字段注入

通过反射直接注入字段依赖,使用@Autowired注解标注字段。

特点

  • 简洁性:代码量最少,直接标注字段。
  • 隐蔽性:依赖关系不明显。

优点

  • 编写快速,适合快速原型开发。
  • 减少样板代码。

缺点

  • 难以进行单元测试(需要反射或Spring容器)。
  • 违反单一职责原则,容易过度注入。
  • 可能隐藏设计问题。

示例

@Service
public class ProductService {@Autowiredprivate InventoryService inventoryService;
}

选择建议

构造器注入适用场景

  • 强依赖的组件(如数据库访问层)
  • 需要不可变状态的场景
  • 希望明确显示所有依赖
  • Spring 4.3+版本中单构造器可省略@Autowired

Setter注入适用场景

  • 可选依赖配置
  • 需要动态重新配置的bean
  • 遗留代码改造场景

字段注入适用场景

  • 快速原型开发
  • 简单的控制器类
  • 内部工具类(非公共API)

最佳实践组合

  • 核心业务逻辑优先使用构造器注入
  • 可选基础设施组件使用setter注入
  • 控制器/简单bean可酌情使用字段注入
  • 避免混合使用多种注入方式

现代Spring推荐

Spring官方自4.x版本开始推荐构造器注入作为主要方式:

@Service
public class ModernService {private final DependencyA a;private final DependencyB b;// Spring4.3+ 单构造器可自动装配public ModernService(DependencyA a, DependencyB b) {this.a = a;this.b = b;}
}

对于集合类型注入,Spring支持所有三种方式:

// 构造器方式
public class CollectionInjection {private final List validators;public CollectionInjection(List validators) {this.validators = validators;}
}
// Setter方式
public void setValidators(List validators) {this.validators = validators;
}
// 字段方式
@Autowired
private List validators;

特殊注入场景

Optional依赖
Spring 5.0+支持Optional包装:

public class OptionalService {private final Optional service;public OptionalService(Optional service) {this.service = service;}
}

懒加载注入
结合@Lazy注解实现延迟初始化:

public class LazyService {@Lazy@Autowiredprivate HeavyResource resource;
}

限定符注入
使用@Qualifier解决歧义:

public class QualifierExample {@Autowired@Qualifier("mainDataSource")private DataSource dataSource;
}

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

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

相关文章

CSP-S 考前集训

10.8-10.9: whk 10.10 专题。 CF1798E Multitest Generator:直接做就行,发现答案至多为 \(2\)。 CF2066C Bitwise Slides:我们维护那两个相同的数,再 dp。 CF431D Random Task:发现答案满足单调性,可以二分+数位…

通过rqlite sdk 快速访问sqlite-vec

通过rqlite sdk 快速访问sqlite-vecsqlite-vec 的的轻量化以及标准sqlite 扩展的模式对于需要使用向量存储的场景(比如相似比较的),但是使用上可能并不是很友好(从轻量化来说够用了,但是我们很多时候还是需要serv…

Arista EOS 4.35.0F 发布 - 适用于下一代数据中心和云网络的可扩展操作系统

Arista EOS 4.35.0F 发布 - 适用于下一代数据中心和云网络的可扩展操作系统Arista EOS 4.35.0F 发布 - 适用于下一代数据中心和云网络的可扩展操作系统 EOS 数据中心网络操作系统 请访问原文链接:https://sysin.org/b…

CSharp: itextsharp5 imge converter pdf

using iTextSharp.text; using iTextSharp.text.pdf; using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; using System.Web; using System.Web.UI; using …

20251011 总结

P9870 [NOIP2023] 双序列拓展 首先有一个暴力做法。 翻译一下题意,即为:拓展也就是一个DP,我们设朴素DP,每次判断能否往下拓展,设fij表示x匹配到第i位,y匹配到第j位。 然后考虑特殊性质:也就是说,这个特殊性质…

上课讲的部分 qoj 题记录

上课讲的部分 qoj 题记录上课讲的部分 qoj 题记录 #6299. Binary String

CSP-S 第二轮集训资料 **总结 + 专题细分精讲**_from_黄老师

CSP-S第二轮集训资料 总结 + 专题细分精讲。 为方便查阅,采用「总-分」结构:先用一张 思维导图级总表 可以30 秒看清全局; 对专题资料做 “三维”剖析:知识脉络(思维导图) 典型题目(含算法/陷阱/复杂度) 可迁移…

AI元人文:迈向正负价值统一的文明架构

AI元人文:迈向正负价值统一的文明架构 我们正在建造的不是一个在"好"与"坏"间被动权衡的文明反应堆,而是一个能同时驾驭创造与守护的文明引擎。AI元人文构想的终极承诺,是在系统内外实现正价值…

CSP-S 第二轮集训资料 **总结 + 专题细分精讲**。

CSP-S第二轮集训资料 总结 + 专题细分精讲。 为方便查阅,采用「总-分」结构:先用一张 思维导图级总表 可以30 秒看清全局; 对专题资料做 “三维”剖析:知识脉络(思维导图) 典型题目(含算法/陷阱/复杂度) 可迁移…

对抗训练提升产品搜索技术解析

本文介绍了一种利用对抗训练改进产品搜索系统的新方法,通过自动生成负训练样本来提升深度学习模型性能,在实验中比现有最佳方法提升16%的效果,详细阐述了神经网络架构和注意力机制的应用。对抗训练改进产品发现 深度…

Ubuntu Linux双网口主机实现在校园网环境下的网络共享

实例描述: 双千兆网口x86架构主机,Ubuntu Linux 22.04 Desktop版(Server版本同理),enp1s0连接需要认证的校园网(可能有设备最大连接数限制),enp2s0连接路由器。此时假设Ubuntu Linux已经通过校园网的认证并设置…

251012

251012我爱音乐,但是只有为数不多的乐队能唱出生命的感觉,好像我置身环境,而且所有的歌词都不是矫揉造作,充满了答案和问题,我爱今天里的这段时间,让我充满活力

C# Avalonia 16- Animation- ExpandElement

C# Avalonia 16- Animation- ExpandElement置顶的 C# Avalonia配置 已经更新 ExpandElement.axaml代码<Window xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx…

DshanPI-A1 RK3576 armbian远程桌面

背景与问题使用设备:DshanPI-A1,搭载 Armbian 系统,窗口系统为 Wayland,GPU 采用开源驱动。初始尝试:使用 NoMachine 实现远程桌面,但存在两个问题:默认创建虚拟桌面,而非物理桌面;对 Wayland 支持不佳,会以…

Ubuntu Linux双网卡实现在校园网环境下的网络共享

实例描述: 双千兆网卡x86架构主机,Ubuntu Linux 22.04 Desktop版(Server版本同理),enp1s0连接需要认证的校园网(可能有设备最大连接数限制),enp2s0连接路由器。此时假设Ubuntu Linux已经通过校园网的认证并设置…

PVE8.x仅克隆虚拟机配置

PVE8.x仅克隆虚拟机配置操作步骤 复制配置文件 cp /etc/pve/qemu-server/<源VM ID>.conf /etc/pve/qemu-server/<新VM ID>.conf 编辑配置文件 ​ 修改磁盘路径:将原 VM ID 替换为新 ID(如 vm-100-disk-0…

SQL常用语句分类及示例

SQL常用语句分类及示例好的,SQL常用语句可以分为以下几大类,我将为您详细介绍并附上示例。这些语句是操作和查询关系型数据库的基础。 1. 数据查询语句 (DQL - Data Query Language) 主要用于从数据库中查询数据,核…

台式机主板上的电池要更换啦

当有内存、硬盘变动时,每次开机ASUS Z170-A主板都提示需要按F1进行重新设置,即使在主板BIOS的设置中把F1提示关闭,依旧不行。 同时Intel Virutalization选择enable,都无法生效。 这时可能是CMOS battery failure,…