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

Spring IoC 与 DI 核心原理学习笔记(根据黑马课程ssm笔记总结)

Spring IoC 与 DI 核心原理学习笔记

一、什么是 IoC(Inversion of Control,控制反转)

1. IoC 的思想

IoC(控制反转)是一种设计思想,它将原本由程序自身控制的对象创建与依赖管理,交给容器来完成

原本:对象自己new依赖
现在:由 IoC 容器统一创建和维护对象之间的关系

2. IoC 解决了什么问题?

  • 降低代码之间的耦合度
  • 提高代码的可维护性
  • 更方便进行单元测试
  • 对象生命周期由容器统一管理

二、IoC 在 Spring 中的体现

在 Spring 中,IoC 容器负责:

  • 创建 Bean 对象
  • 管理 Bean 的生命周期
  • 维护 Bean 之间的依赖关系

示例:传统方式的问题

publicclassBookServiceImplimplementsBookService{privateBookDaobookDao=newBookDaoImpl();@Overridepublicvoidsave(){bookDao.save();}}

问题:

  • BookService强依赖BookDaoImpl
  • 一旦 DAO 实现发生变化,需要修改 Service 源码
  • 耦合度过高

三、DI(Dependency Injection,依赖注入)

1. 什么是 DI?

DI 是 IoC 的具体实现方式,用于在运行时将对象所依赖的其他对象注入进来。

IoC 是思想,DI 是实现

2. 为什么需要 DI?

业务层(Service)通常依赖 DAO 层的数据支持,而 DAO 层在 Spring 中同样作为 Bean 统一管理。
IoC 容器负责将Service 与其依赖的 DAO 自动“装配”在一起


四、使用 Spring + XML 实现 DI

1. 删除new,使用 setter 注入

Service 类
publicclassBookServiceImplimplementsBookService{privateBookDaobookDao;publicvoidsetBookDao(BookDaobookDao){this.bookDao=bookDao;}@Overridepublicvoidsave(){bookDao.save();}}

2. XML 中的配置

<beanid="bookDao"class="com.itheima.dao.impl.BookDaoImpl"/><beanid="bookService"class="com.itheima.service.impl.BookServiceImpl"><propertyname="bookDao"ref="bookDao"/></bean>

这样:

  • Service 不再关心 DAO 的具体实现
  • 依赖关系由 Spring 容器维护

五、Bean 的别名(alias)

Spring 中的 Bean 是可以起别名的:

<aliasname="bookService"alias="service"/>

之后可以通过service获取同一个 Bean 实例。


六、Bean 的作用范围(Scope)

1. 默认作用域:singleton

  • Spring 中Bean 默认是单例的
  • 适合被频繁复用的对象(如 Service、DAO)
<beanid="bookDao"class="com.itheima.dao.impl.BookDaoImpl"scope="singleton"/>

2. prototype(多例)

<beanid="bookDao"class="com.itheima.dao.impl.BookDaoImpl"scope="prototype"/>

每次获取都会创建一个新的对象。


七、Spring 创建 Bean 的底层原理

1. 使用反射创建对象

Spring 底层通过反射机制创建 Bean:

  • 构造方法可以是publicprivate
  • 默认使用无参构造方法

⚠️ 如果类中只有有参构造而没有无参构造,会抛出异常。


八、Spring 中实例化 Bean 的四种方式

方式一:构造方法(常用)

publicclassBookDaoImplimplementsBookDao{publicBookDaoImpl(){System.out.println("BookDao constructor running...");}@Overridepublicvoidsave(){System.out.println("book dao save...");}}
<beanid="bookDao"class="com.itheima.dao.impl.BookDaoImpl"/>

方式二:静态工厂(了解)

工厂类
publicclassOrderDaoFactory{publicstaticOrderDaogetOrderDao(){returnnewOrderDaoImpl();}}
XML 配置
<beanid="orderDao"class="com.itheima.factory.OrderDaoFactory"factory-method="getOrderDao"/>

方式三:实例工厂(了解)

工厂类
publicclassUserDaoFactory{publicUserDaogetUserDao(){returnnewUserDaoImpl();}}
XML 配置
<beanid="userDaoFactory"class="com.itheima.factory.UserDaoFactory"/><beanid="userDao"factory-bean="userDaoFactory"factory-method="getUserDao"/>

方式四:FactoryBean(推荐)

FactoryBean 实现类
publicclassUserDaoFactoryBeanimplementsFactoryBean<UserDao>{@OverridepublicUserDaogetObject(){returnnewUserDaoImpl();}@OverridepublicClass<?>getObjectType(){returnUserDao.class;}}
XML 配置
<beanid="userDao"class="com.itheima.factory.UserDaoFactoryBean"/>

九、总结

  • IoC:控制反转,是一种设计思想

  • DI:依赖注入,是 IoC 的具体实现

  • Spring 容器:

    • 创建对象
    • 管理依赖
    • 维护生命周期
  • Bean 默认是单例

  • 实例化 Bean 有4 种方式

  • 推荐使用:

    • 构造方法
    • FactoryBean

掌握 IoC 与 DI,是理解 Spring 框架的核心基础。


十、实例化 Bean 的三种方式(一):构造方法(常用)

1. 构造方法实例化说明

Spring 在默认情况下,通过反射调用类的无参构造方法来创建 Bean 对象

只要类中:

  • 提供了可访问的构造方法
  • 并且存在无参构造

Spring 就可以正常完成 Bean 的实例化。

2. 示例代码

Bean 类
publicclassBookDaoImplimplementsBookDao{publicBookDaoImpl(){System.out.println("book constructor is running...");}@Overridepublicvoidsave(){System.out.println("book dao save...");}}
XML 配置
<beanid="bookDao"class="com.itheima.dao.impl.BookDaoImpl"/>

3. 注意事项(面试高频)

⚠️如果无参构造方法不存在,将抛出异常:

BeanCreationException

原因:

  • Spring 默认使用无参构造方法创建对象
  • 没有无参构造,反射无法实例化 Bean

✅ 解决方式:

  • 提供无参构造方法
  • 或使用构造参数注入(后续章节)

十一、Bean 的生命周期(重点)

Bean 的生命周期描述了Bean 从创建到销毁的完整过程

1. Bean 生命周期整体流程

(1)初始化容器阶段
  1. 创建对象(分配内存)
  2. 执行构造方法
  3. 执行属性注入(set方法)
  4. 执行 Bean 初始化方法
(2)使用 Bean 阶段
  • 执行业务逻辑方法
(3)销毁容器阶段
  1. 执行 Bean 销毁方法
  2. 释放资源

📌简化记忆口诀:

构造 → 注入 → 初始化 → 使用 → 销毁


十二、Bean 销毁时机与容器关闭

1. Bean 销毁触发条件

  • 容器关闭时,才会触发 Bean 的销毁
  • 销毁方法不会自动执行,必须显式关闭容器

2. 容器关闭的两种方式

方式一:手动关闭容器(常见)
publicclassAppForLifeCycle{publicstaticvoidmain(String[]args){ConfigurableApplicationContextctx=newClassPathXmlApplicationContext("applicationContext.xml");ctx.close();}}
  • 调用close()方法
  • 立即触发 Bean 的销毁逻辑

方式二:注册 JVM 关闭钩子(推荐)
ctx.registerShutdownHook();

特点:

  • JVM 退出前自动关闭 Spring 容器
  • 常用于 Web 项目 / 长时间运行程序

十三、Bean 生命周期的控制方式

1. 通过 XML 配置生命周期方法(常用)

Bean 类
publicclassBookDaoImpl{publicvoidinit(){System.out.println("bean init...");}publicvoiddestroy(){System.out.println("bean destroy...");}}
XML 配置
<beanid="bookDao"class="com.itheima.dao.impl.BookDaoImpl"init-method="init"destroy-method="destroy"/>

2. 通过接口控制生命周期(了解)

初始化接口
publicclassBookDaoImplimplementsInitializingBean{@OverridepublicvoidafterPropertiesSet(){System.out.println("after properties set...");}}
销毁接口
publicclassBookDaoImplimplementsDisposableBean{@Overridepublicvoiddestroy(){System.out.println("bean destroy...");}}

📌实际开发建议:

  • ✅ 优先使用init-method/destroy-method
  • ❌ 尽量避免侵入业务代码的接口方式

十四、小结

  • Spring 默认通过无参构造方法实例化 Bean

  • Bean 生命周期五步:

    1. 构造
    2. 属性注入
    3. 初始化
    4. 使用
    5. 销毁
  • Bean 销毁必须关闭容器

  • 生命周期控制方式:

    • XML(推荐)
    • 接口(了解)
http://www.jsqmd.com/news/159353/

相关文章:

  • 2025年比较好的聚脲美缝剂实力厂家TOP推荐榜 - 品牌宣传支持者
  • PyTorch-CUDA-v2.7镜像在学术研究中的应用前景
  • 2025远程联网门禁专业厂家TOP5权威推荐:宿舍联网门禁制造商甄选指南 - 工业品牌热点
  • 【必收藏】大模型领域六大类岗位详解+系统学习路径,附免费资源,小白也能入行AI
  • 防脱洗发水排行榜口碑最好的十款!哪款洗发水防脱最靠谱?第一名无硅油中药配方更安心 - 博客万
  • 中央空调西门子1200PLC与TP900触摸屏模拟仿真T124,带视频,博途V15.1
  • 电脑扬声器没声音显示驱动异常怎么办?深度解析与提供两种修复方案
  • PyTorch-CUDA镜像在音乐生成创作中的可能性
  • 超高分子量聚乙烯含硼板生产商哪家好?售后好的加工厂推荐 - 工业品牌热点
  • 2025年热门的展馆展厅设计品质实力榜 - 品牌宣传支持者
  • 2025年无线门禁系统品牌商排名:宿舍门禁系统品牌推荐 - 工业设备
  • Matlab模型下的“共享储能电站“在工业用户日前优化经济调度中的实践与场景3不完全复现
  • PyTorch-CUDA镜像中运行Whisper模型的体验报告
  • 2025年广东门窗品牌排行榜,服务好、隔音好品牌推荐 - 工业推荐榜
  • 风光储、风光储并网VSG直流微电网Simulink仿真模型:系统构成与控制策略
  • PyTorch-CUDA镜像与VS Code远程开发集成指南
  • 2025年广东口碑好的门窗品牌推荐:大众品牌与创新能力全解析 - 工业品网
  • PyTorch-CUDA镜像如何提升GPT类模型推理效率
  • PyTorch-CUDA镜像中如何监控GPU利用率
  • PyTorch-CUDA镜像在医学影像分析中的潜力
  • 2025年口碑好的诚信SAP系统企业推荐,服务不错的SAP系统品牌企业全解析 - 工业品网
  • PyTorch-CUDA-v2.7镜像能否用于虚假新闻检测
  • PyTorch-CUDA-v2.7镜像在安防监控场景的落地
  • PyTorch-CUDA镜像如何降低大模型训练成本
  • 【珍藏】大模型开发不再难!Dify低代码平台详解+实战案例,手把手教你构建第一个AI应用
  • 最有效的抗衰产品?内服抗衰老哪个牌子最好?抗衰老保健产品排行榜,科学认证十款热门口碑分析,超靠谱 - 博客万
  • Safeguard Global名义雇主EOR服务商-2026年企业出海德国合规雇佣的优选方案 - 品牌2025
  • java+vue+SpringBoot图书电子商务网站(程序+数据库+报告+部署教程+答辩指导)
  • 我发现流式写入性能差后来才知道用writev批量合并数据块
  • 2025年信誉度高的数据中心防雷接地/数据中心环境高性价比推荐榜 - 品牌宣传支持者