spring学习( IOC【控制发转】)
目录
前言
IOC容器的含义
含义
如何理解 loc 既是 设计原则 又是 生产,管理 对象的容器
Spring IoC 容器的主要功能
如何通过IOC 创建目标 对象
Bean工厂与IOC容器
BeanFactory实例化对象
ApplicationContext与BeanFactory实例化对象的区别
小结
前言
为什么要 深入学习 Ioc ?
答:上一篇博客 :CSDN,简单的介绍了 为什么学习 spring ?学习 spring 是为了避免 手动创建对象 造成 代码高度耦合。如何降低耦合,上一篇博客提到 把 对象的创建 ,交给 spring 管理 ,由 spring 创建。具体是由 spring下的 IOC 容器 负责。
IOC容器的含义
含义
Spring IoC(Inversion of Control,控制反转)容器是 Spring 框架的核心组件之一,负责管理应用程序中的对象(Bean)及其依赖关系。IoC 是一种设计原则,Spring 通过 IoC 容器实现这一原则。
从含义中,可以了解 loc 既是 设计原则 又是 生产,管理 对象的容器
如何理解 loc 既是 设计原则 又是 生产,管理 对象的容器
loc 是 一种设计原则
控制反转 是 一种设计原则 就是 将程序的控制权从开发者手中转移到框架或容器中。传统编程中,开发者需要手动创建对象、管理依赖关系,而 IoC 原则将这一责任交给框架或容器来处理。
核心概念
控制反转(IoC):
传统编程中,对象的创建和依赖管理由开发者手动完成。
IoC 将这一责任交给容器,开发者只需定义对象及其依赖关系,容器负责实例化和组装。
依赖注入(DI):
DI 是 IoC 的一种实现方式,容器通过构造函数、setter 方法或字段注入对象的依赖。
IoC 容器是 IoC 原则的实现
- IoC 原则需要通过具体的工具或框架来实现,而 Spring 框架中的 IoC 容器 就是 IoC 原则的具体实现
Spring IoC 容器的主要功能
Bean 管理:
负责创建、配置和管理 Bean 的生命周期。
依赖注入:
自动解析并注入 Bean 之间的依赖关系。
配置管理:
支持 XML、注解和 Java 配置等多种方式定义 Bean。
生命周期管理:
提供 Bean 的初始化和销毁回调机制。
作用域管理:
支持 Singleton、Prototype 等不同的 Bean 作用域。
实例【 IOC 控制反转】
假设 当前需要 一个 Student 类对象,传统方法是
// 传统方式:开发者手动控制 Student student=new Student();
而在 IoC 原则下,控制权交给容器,开发者只需定义依赖关系,容器会自动完成对象的创建和注入。
<!--创建Student 类 的对象--> <bean id="student" class="fs.entity.Student"> </bean>
如何通过IOC 创建目标 对象
通过之前的代码演示,IOC 创建目标 对象 的步骤
- 0 导入 spring-context 依赖
- 1 添加实体类
- 2 添加 spring.xml 配置文件,文件里配置目标对象
- 3 测试类中 创建 容器对象
- 4 调用getBean方法获取
注意:上面演示的步骤是 无参构造方法 创建对象
我们知道构造方法分两种 :无参 构造方法 和有参构造方法
我们还清楚的知道
1 当你不写 构造方法时,系统会默认无参构造方法
2 当你只写有参构造方法时,无参构造方法会被覆盖
如果依照之前的模式,是会报一个 BeanCreationException 表示 生产不了 student 对象
原因是 找不到 无参构造方法
那么如果我要使用有参构造方法,创建对象 应该怎么做呢?
只需要修改 spring 配置文件,添加
- 标签: constructor-arg 表示 构造方法的参数
- 属性:name :参数名; value 参数值
<!--创建Student 类 的对象--> <bean id="student" class="fs.entity.Student"> <constructor-arg name="id" value="1"/> <constructor-arg name="name" value="张三"/> <constructor-arg name="gender" value="男"/> </bean>
其他地方不变,重新运行
除了构造方法创建对象外,还有 工厂模式创建对象,factorybean 规范 创建对象
- 静态工厂创建对象
- 实例化工厂创建 对象
- 实现 factorybean 规范【接口】
这些,在之后的博客中,会详细叙述
Bean工厂与IOC容器
之前说 IOC 容器 是 创建对象的容器 ,我们可以从容器中获得目标对象。
那么 Bean 工厂【BeanFactory] 是什么?
在 StudentController 测试类中 ,选中 ClassPathXmlApplicationContext 鼠标右击 看到 图表 --》显示图
从图中可以发现: ClassPathXmlApplicationContext 是BeanFactory 的实现子类
从这可以推出 既然 IOC 容器 可以创建 对象,那么作为创建IOC 容器 对象的父 接口 BeanFactory 是否也可以生产对象呢?我们保留这个疑问
BeanFactory实例化对象
思路
我们清楚 BeanFactory【bean 工厂】 是一个接口 ,要想 向 IOC 容器一样 获得目标对象
1 需要创建 工厂 对象 ,生产目标 对象。
2 需要一个 BeanFactory 的实现子类 实现 这个接口
- 发现 实现子类的构造方法不包含参数 ,因此你需要单独加载配置文件
- 加载 配置文件 的对象 要和 beanFactory 对象产生联系
3 需要创建 加载 配置文件 的对象,并调用 方法 加载配置文件
4 从工厂获得 目标对象
package fs.Controller; import fs.entity.Student; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.core.io.ClassPathResource; public class StudentController { public static void main(String[] args) { // beanfactory bean 工厂创建对象 DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); // 创建一个加载配置文件的对象 // 创建一个 XmlBeanDefinitionReader 实例,并关联到 beanFactory XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory); // 加载位于类路径下的Spring配置文件 reader.loadBeanDefinitions(new ClassPathResource("springConfig.xml")); // 从工厂中获取Bean实例 Student student = (Student) beanFactory.getBean("student"); System.out.println(student); } }
运行结果
ApplicationContext与BeanFactory实例化对象的区别
通过 图片上显示的代码可以发现,加载配置文件 IOC容器 是即时加载【当创建 容器对象 时,就读取配置文件了】;bean 工厂 是 延时加载【和 IOC 容器 不同的是,需要 有加载配置文件对象,经调用方法 才加载 成功】
验证 加载配置文件 IOC容器 是即时加载,而bean 工厂 是 延时加载
注意:重点 是要观察 经过打断点后 beanFactory---> beanDefinitionMap 中是否存在 目标对象。如果存在 ,则表示 配置文件读取成功。
IOC容器 是即时加载
打开 beanFactory ,看到 beanDefinitionMap ,在这里看到目标 类对象 student
说明 IOC 容器 在创建的时候就被加载了
bean 工厂 是 延时加载
经过打断点发现在 创建 bean 工厂 对象 的时候, beanDefinitionMap 还是 0
继续走,发现 当 调用 loadBeanDefinitions 方法后 就有目标对象 student 了
说明 bean 工厂 并不是 当创建 工厂对象的时候,就加载配置文件,要等到加载配置文件对象调用方法后才加载成功
小结
本篇博客的重点是
1 了解 为什么要使用 IOC 容器 创建对象
降低 代码的 因手动 创建对象的 耦合性
2 学习 如何根据具体的场景 ,使用IOC 容器 创建对象
构造方法
- 无参构造方法
- 有参构造方法
工厂模式【之后的博客会重点讲解】
- 静态工厂
- 实例化工厂
实现 factorybean 规范 【之后的博客会重点讲解】
3 理解 Bean 工厂和 IOC 容器 创建对象的区别
- 加载配置文件 IOC容器 是即时加载,而bean 工厂 是 延时加载