news 2026/9/24 3:21:09

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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(推荐)
    • 接口(了解)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/21 16:56:34

JS浏览器兼容问题怎么解决?3个核心方法实战解析

处理JavaScript的浏览器兼容性问题&#xff0c;是前端开发中一项虽基础却至关重要的实际工作。它并非仅仅是技术上的挑战&#xff0c;更直接影响着网站在不同用户环境下的可用性与体验。现代Web开发虽已提供诸多工具和方法&#xff0c;但理解其根源并建立有效的应对策略&#x…

作者头像 李华
网站建设 2026/9/20 10:28:02

HTML5 Canvas画图,这些核心参数你必须懂

在网页开发中&#xff0c;HTML5通过Canvas元素提供了强大的绘图能力&#xff0c;其核心在于一系列用于控制绘制行为的参数。掌握这些参数是进行自定义图形绘制、数据可视化乃至游戏开发的基础。理解每个参数的具体含义和适用场景&#xff0c;能帮助开发者精确控制线条、形状、颜…

作者头像 李华
网站建设 2026/9/20 10:38:13

贝舒地尔Belumosudil每日一次或两次给药方案选择及副作用管理

贝舒地尔&#xff08;Belumosudil&#xff09;作为治疗慢性移植物抗宿主病&#xff08;cGVHD&#xff09;的创新药物&#xff0c;其用药方案的合理选择以及副作用的有效管理&#xff0c;对于提高患者的治疗效果和生活质量至关重要。目前&#xff0c;贝舒地尔有每日一次和每日两…

作者头像 李华
网站建设 2026/9/20 6:10:33

风光储、风光储并网VSG直流微电网Simulink仿真模型:系统构成与控制策略

风光储、风光储并网VSG直流微电网simulink仿真模型。 系统有光伏发电系统、风力发电系统、储能系统、负载、逆变器?lc滤波器?大电网构成。 附参考文献。光伏系统采用扰动观察法实现mppt控制&#xff0c;经过boost电路并入母线&#xff1b; 风机采用最佳叶尖速比实现mppt控制&…

作者头像 李华
网站建设 2026/8/30 19:01:38

Python 将 PDF 表格数据提取至 TXT 或 Excel

在数据处理与办公自动化场景中&#xff0c;PDF 表格因格式稳定被广泛使用&#xff0c;但不可直接编辑的特性&#xff0c;给数据统计、分析和二次加工带来诸多不便。手动复制粘贴不仅效率低下&#xff0c;还容易出现数据错位、遗漏等问题。 本文将分享一种高效的解决方案—基于P…

作者头像 李华