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

Spring中实现依赖注入(DI)的三种方式

 1. @Autowired 字段注入(不推荐)​

@Service
public class UserService {@Autowired  // 直接在字段上注入private UserRepository userRepository;
}

​原理​​:Spring 启动时扫描所有 @Component@Service 等注解的类,发现 @Autowired 字段后,自动从容器中查找匹配的 Bean 并注入。

2. Setter 注入​(不推荐)

@Service
public class UserService {private UserRepository userRepository;@Autowired  // 在 setter 方法上注入public void setUserRepository(UserRepository userRepository) {this.userRepository = userRepository;}
}

​​原理​​:Spring 扫描到 @Autowired 标记的 Setter 方法后,自动调用该方法注入依赖。

3. 构造函数注入​(推荐)

3.1 手动构造函数

@Service
public class UserService {private final UserRepository userRepository;  // final 确保不可变// 手动编写构造函数public UserService(UserRepository userRepository) {this.userRepository = userRepository;}
}

​原理​:

  • Spring 通过反射调用构造函数,自动注入依赖。
  • ​Spring 4.3+ 后,如果类只有一个构造函数,可以省略 @Autowired​(Spring 会自动识别)。

3.2 构造函数 + @RequiredArgsConstructor(Lombok)(强烈推荐)

@Service
@RequiredArgsConstructor  // Lombok 自动生成构造函数
public class UserService {private final UserRepository userRepository;  // final 确保不可变
}

原理​:

  • Lombok 的 @RequiredArgsConstructor 会自动生成一个包含所有 final 字段和 @NonNull 字段的构造函数。
  • Spring 会自动调用这个构造函数注入依赖(无需 @Autowired)。

总结

特性@Autowired 字段注入Setter 注入构造函数注入构造函数 + @RequiredArgsConstructor
​代码简洁性​⭐⭐⭐⭐(最简洁)⭐⭐⭐⭐⭐(需手动写构造函数)⭐⭐⭐⭐(Lombok 自动生成)
​可读性​⭐(依赖关系隐藏)⭐⭐(setter 分散)⭐⭐⭐⭐(构造函数明确)⭐⭐⭐⭐(和手动构造函数一样清晰)
​可测试性​❌(难以测试)⭐⭐(需手动注入)⭐⭐⭐⭐(直接传入 mock)⭐⭐⭐⭐(和手动构造函数一样)
​不可变性(final)​❌(不支持)❌(不支持)⭐⭐⭐⭐(支持)⭐⭐⭐⭐(支持)

​Spring

推荐程度​

❌(不推荐)⭐(仅可选依赖)⭐⭐⭐⭐(推荐)⭐⭐⭐⭐(推荐)
​是否需要 Lombok​⭐⭐⭐⭐(依赖 Lombok)
http://www.dtcms.com/a/267068.html

相关文章:

  • Spring Bean 生命周期 SmartLifecycle接口介绍和使用场景 和 Lifecycle对比
  • 【Linux】02_CentOS 7 开机运行级别详解:从基础概念到实战配置
  • 浅谈 Vue2 的 Mixin 混入和 Vue3 的 Hooks(组合式 API)
  • Eureka、Nacos、LoadBalance、OpenFeign​之间的区别联系和协作 (附代码讲解)
  • 深入理解Qt的SetWindowsFlags函数
  • Kafka消费者分区分配机制与生产环境配置指南
  • LabVIEW 3D 场景中 Voronoi 图(基站覆盖模拟)功能
  • 03每日简报20250705
  • 国产MCU学习Day7——CW32F030C8T6 SPI主从通信详解
  • Django中关于templates目录和static目录存放位置的总结
  • 基于开源AI智能名片链动2+1模式的S2B2C商城小程序:门店私域流量与视频号直播融合的生态创新研究
  • 【51单片机】51单片机学习笔记-课程简介
  • 权电阻网络DAC实现电压输出型数模转换Multisim电路仿真——硬件工程师笔记
  • 共射级放大电路的频率响应Multisim电路仿真——硬件工程师笔记
  • 程序计数器(PC)是什么?
  • 一个简单的分布式追踪系统
  • 【AI大模型面试八股文】大模型训练中如何应对灾难性遗忘问题?
  • 快速掌握Python编程基础
  • 【Qt】事件处理、事件分发器、事件过滤器
  • Ionic 安装使用教程
  • CPU指令集权限
  • mysql基础(一)快速上手篇
  • Swift 安装使用教程
  • 百度AI文心大模型4.5系列开源模型评测,从安装部署到应用体验
  • Python区块链服务及API实现
  • 物联网软件层面的核心技术体系
  • Day51 复习日-模型改进
  • Python 的内置函数 reversed
  • 系统移植基础部分
  • Resource punkt_tab not found. NLTK