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

DI依赖注入

依赖注入(Dependency Injection)

依赖注入(DI)是控制反转(IoC)的一种实现方式,核心思想是:将类所依赖的对象通过外部注入,而非类内部自行创建,从而降低类之间的耦合度。简单来说,就是“给某个类中的属性赋值”,但赋值过程由外部容器(如Spring)管理。

依赖注入的常见方式

1. 构造器注入

通过类的构造方法传递依赖对象,容器在创建对象时调用构造器并传入所需的依赖。

适用场景:依赖必须存在(不可缺省),且创建后不允许修改的场景。

代码示例

// 被依赖的类
public class UserDao {public void addUser() {System.out.println("添加用户到数据库");}
}// 依赖注入的类(通过构造器注入UserDao)
public class UserService {private UserDao userDao;// 构造器注入:通过构造方法接收依赖public UserService(UserDao userDao) {this.userDao = userDao;}public void register() {userDao.addUser(); // 使用注入的依赖}
}// Spring配置文件(applicationContext.xml)
<bean id="userDao" class="com.example.UserDao"/>
<bean id="userService" class="com.example.UserService"><!-- 构造器注入:通过name指定构造方法参数名,ref引用其他bean --><constructor-arg name="userDao" ref="userDao"/>
</bean>

2. Set方法注入

通过类的setter方法为属性赋值,容器在创建对象后调用set方法注入依赖。

适用场景:依赖可选(可缺省),或需要在对象创建后动态修改依赖的场景。

支持的注入类型:
  • 基本数据类型(int、String等)
  • 引用数据类型(其他Bean)
  • 集合类型(List、Map、Set等)

代码示例

public class OrderService {// 基本类型属性private String serviceName;private int maxOrderCount;// 引用类型属性private UserDao userDao;// 集合类型属性private List<String> orderTypes;private Map<String, Integer> orderLimits;// Setter方法(用于注入)public void setServiceName(String serviceName) {this.serviceName = serviceName;}public void setMaxOrderCount(int maxOrderCount) {this.maxOrderCount = maxOrderCount;}public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void setOrderTypes(List<String> orderTypes) {this.orderTypes = orderTypes;}public void setOrderLimits(Map<String, Integer> orderLimits) {this.orderLimits = orderLimits;}// 测试方法public void showInfo() {System.out.println("服务名称:" + serviceName);System.out.println("最大订单数:" + maxOrderCount);System.out.println("关联的UserDao:" + userDao);System.out.println("订单类型:" + orderTypes);System.out.println("订单限额:" + orderLimits);}
}// Spring配置文件(applicationContext.xml)
<bean id="userDao" class="com.example.UserDao"/><bean id="orderService" class="com.example.OrderService"><!-- 基本类型注入 --><property name="serviceName" value="订单服务"/><property name="maxOrderCount" value="100"/><!-- 引用类型注入(ref指向其他bean) --><property name="userDao" ref="userDao"/><!-- 集合类型注入 --><property name="orderTypes"><list><value>普通订单</value><value>秒杀订单</value></list></property><property name="orderLimits"><map><entry key="普通订单" value="50"/><entry key="秒杀订单" value="10"/></map></property>
</bean>

3. 命名空间注入(c命名和p命名)

通过XML命名空间简化注入配置,本质是构造器注入和set方法注入的语法糖。

(1)p命名空间注入(对应set方法注入)
  • 需在XML中声明命名空间:xmlns:p="http://www.springframework.org/schema/p"
  • 语法:p:属性名="值"(基本类型)或 p:属性名-ref="beanId"(引用类型)

代码示例

<!-- 声明p命名空间 -->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="userDao" class="com.example.UserDao"/><!-- p命名空间注入(等价于set方法注入) --><bean id="orderService" class="com.example.OrderService"p:serviceName="订单服务"p:maxOrderCount="100"p:userDao-ref="userDao"/> <!-- 引用类型用-ref -->
</beans>
(2)c命名空间注入(对应构造器注入)
  • 需在XML中声明命名空间:xmlns:c="http://www.springframework.org/schema/c"
  • 语法:c:参数名="值"(基本类型)或 c:参数名-ref="beanId"(引用类型)

代码示例

<!-- 声明c命名空间 -->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:c="http://www.springframework.org/schema/c"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="userDao" class="com.example.UserDao"/><!-- c命名空间注入(等价于构造器注入) --><bean id="userService" class="com.example.UserService"c:userDao-ref="userDao"/> <!-- 构造方法参数名为userDao -->
</beans>

总结

  • 构造器注入:通过构造方法传递依赖,适合必填依赖。
  • Set方法注入:通过setter方法赋值,支持多种数据类型,适合可选依赖。
  • 命名空间注入:c命名(构造器)和p命名(set方法)的简化语法,减少XML配置冗余。

依赖注入的核心是“解耦”,让类更专注于自身业务逻辑,而非依赖对象的创建。

http://www.gsyq.cn/news/46725.html

相关文章:

  • 解码LVGL定时器
  • 如何选择锡林郭勒西林瓶灌装旋盖机?环境温湿度要求详解
  • 北京GEO优化服务商2025权威推荐:抢占AI搜索流量新入口
  • 雅思报班哪个机构比较好?过来人分享选择经验与价格课程对比
  • 云原生周刊丨runc 三大高危漏洞曝光
  • 【ACM出版 | EI检索稳定】2025年人工智能、业务转型和数据科学创新国际学术会议(ICBTDS 2025)
  • echarts 树形结构图实例
  • 国标GB28181算法算力平台EasyGBS:深度解析全场景视频调阅功能与行业实战应用
  • 2025出国留学机构综合实力榜:排名前十的留学中介特色分析
  • 基于SpringBoot+Vue的个人理财系统管理系统设计与建立【Java+MySQL+MyBatis完整源码】
  • python使用PyInstaller打包成exe
  • 【APIE出版 | EI检索快速稳定】2025年机电一体化与轨道、交通国际学术会议(MRT 2025)
  • spark read mongodb拉取的数据行数和源库不一致
  • PV 与 PVC 的“绑定”动作真正发生的时间点
  • 【ACM出版 | 最快会后4个月检索 | 往届均已成功见刊并被EI检索】第三届人工智能、系统与网络安全国际学术会议 (AISNS 2025)
  • it的尽头是炒股
  • [量化01 线形 ]
  • 护栏碰撞报警系统工作原理是什么?传感器+数据传输全解析
  • AI 在数据库操作中的各类应用场景、方案与实践指南 - 指南
  • 2025年11月德语学习课程推荐:德企定制化培训,高性价比职场首选
  • 金风科技通过校企合作、职业培训和数字化平台的多元化培养体系培养新一代风电行业人才
  • 为什么我们很难“举一反三”?
  • charles问题排查
  • 2025年11月深圳近视手术医生榜单:五强对比与权威数据解读
  • 吹风机激光测距感应温度调节方案
  • 2025年11月上海老房翻新公司推荐榜:十强资质与用户评价对比
  • 2025年11月活性氧化铝产品排行:五家主流企业对比评价
  • win10 win11安装openssh客户端的命令
  • 详细介绍:单片机开发工具篇:(二)主流调试器之间的区别
  • py cx_oracle 中文乱码问题分析