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

Spring 中的 DI 是什么?

Spring 中的 DI(Dependency Injection,依赖注入)是 Spring 框架的核心特性之一,也是控制反转(IoC,Inversion of Control)原则的具体实现。

什么是 DI?

依赖注入是一种设计模式,它将对象的依赖关系从对象内部移到外部容器(Spring 容器)来管理。简单来说,就是由容器负责创建对象并注入它所依赖的其他对象,而不是由对象自己创建或查找依赖。

DI 的核心概念

1. 依赖关系

// 没有 DI 的情况publicclassUserService{privateUserDaouserDao;publicUserService(){// 对象自己创建依赖,耦合度高this.userDao=newUserDao();}}// 使用 DI 的情况publicclassUserService{privateUserDaouserDao;// 通过构造函数注入依赖publicUserService(UserDaouserDao){this.userDao=userDao;}}

2. 控制反转

  • 传统方式:对象自己控制依赖的创建和管理
  • DI 方式:控制权反转给 Spring 容器,由容器负责注入依赖

DI 的三种注入方式

1. 构造函数注入(推荐)

@ComponentpublicclassUserService{privatefinalUserDaouserDao;@AutowiredpublicUserService(UserDaouserDao){this.userDao=userDao;}}

2. Setter 方法注入

@ComponentpublicclassUserService{privateUserDaouserDao;@AutowiredpublicvoidsetUserDao(UserDaouserDao){this.userDao=userDao;}}

3. 字段注入(不推荐)

@ComponentpublicclassUserService{@AutowiredprivateUserDaouserDao;}

DI 的优势

  1. 降低耦合度:对象之间通过接口交互,不直接依赖具体实现
  2. 提高可测试性:可以轻松注入 Mock 对象进行单元测试
  3. 便于维护:依赖关系集中管理,修改配置即可改变实现
  4. 促进代码复用:组件可以灵活组合使用
  5. 符合单一职责原则:对象专注于自己的业务逻辑

Spring 中 DI 的实现

Spring 通过以下注解实现 DI:

  • @Component:标记类为 Spring 管理的 Bean
  • @Autowired:自动装配依赖
  • @Service@Repository@Controller:特定场景的组件注解
  • @Qualifier:指定注入的 Bean 名称
  • @Value:注入配置值

实际示例

// 定义接口publicinterfaceMessageService{StringsendMessage(Stringmessage);}// 实现类@Service("emailService")publicclassEmailServiceimplementsMessageService{publicStringsendMessage(Stringmessage){return"Email: "+message;}}@Service("smsService")publicclassSmsServiceimplementsMessageService{publicStringsendMessage(Stringmessage){return"SMS: "+message;}}// 使用依赖注入@ServicepublicclassNotificationService{privatefinalMessageServicemessageService;@AutowiredpublicNotificationService(@Qualifier("emailService")MessageServicemessageService){this.messageService=messageService;}publicvoidsendNotification(Stringmessage){System.out.println(messageService.sendMessage(message));}}

总结

DI 是 Spring 框架的基石,它通过将对象的创建和依赖管理交给容器,实现了松耦合、易测试、易维护的代码结构。在现代 Java 开发中,DI 已经成为主流的设计模式,不仅限于 Spring,在其他框架中也有广泛应用。

http://www.jsqmd.com/news/299877/

相关文章:

  • 深入浅出了解生成模型-8:生成加速策略概述 - Big-Yellow
  • P1102 A-B 数对(lower_bound函数)
  • Java毕设选题推荐:基于springboot的农企信息管理平台设计与开发基于SpringBoot+Vue农企信息管理平台设计与开发【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 【ISAC】5G NR-PRS赋能6G多基地ISAC:LoS/NLoS混合场景定位精度突破28%!【附MATLAB代码】
  • 【电力系统】基于角度-电压耦合引起的稳定性衰减:波德型基本性能限制分析附Matlab代码
  • 【课程设计/毕业设计】基于SpringBoot+Vue农企信息管理平台设计与开发基于springboot的农企信息管理平台设计与开发【附源码、数据库、万字文档】
  • Java计算机毕设之基于springboot的种植基地农业信息管理系统的设计与实现基于springboot的农企信息管理平台设计与开发(完整前后端代码+说明文档+LW,调试定制等)
  • 【SSVEP】基于SSVEP检测频率导向脑活动的VR实验附Matlab代码
  • 基于深度学习YOLOv10的水果分类检测系统(YOLOv10+YOLO数据集+UI界面+Python项目源码+模型)
  • 我用 Claude Code 给自己打造了个人助理,他将比我更了解我自己
  • MiniCPM4-0.5B-QAT-Int4-GPTQ-format 小显存llm
  • 虚拟桌宠工作学习实际收益
  • 两个不同版本的int_fast16的定义
  • 强烈安利9个AI论文软件,专科生轻松搞定毕业论文!
  • 计算机Java毕设实战-基于springboot的农企商品产品信息管理平台设计与开发【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 基于51单片机的水质检测 PH TDS 温度+浊度+报警
  • 基于51单片机的水质检测 PH 浊度 温度 蓝牙 报警
  • 寒假2
  • 基于51单片机的汽车胎压检测系统 蓝牙 气压 温度
  • 基于51单片机的语音识别控制系统设计智能家居声控灯
  • 基于51单片机的银行排队叫号系统 语音呼叫 银行叫号系统电子DIY
  • 基于51单片机的停车场车位管理 停车场收费 刷卡计费计数系统DIY
  • 基于51单片机的智能公交报站系统 公交车语音报站器
  • 基于51单片机的智能窗帘晾衣架 WIFI传输 防盗报警
  • Java毕设选题推荐:基于springboot的绿色有机农产品溯源系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 基于51单片机的智能药盒 WIFI传输 药量检测 定时吃药
  • 亲测好用!专科生必备AI论文软件TOP10测评
  • 基于SpringBoot的七彩云南文化旅游网站毕设
  • 基于SpringBoot的乡村政务办公系统毕业设计源码
  • 基于SpringBoot的城市垃圾分类管理系统毕设源码