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

Spring核心机制:深入理解控制反转(IoC)

Spring核心机制:深入理解控制反转(IoC)

IoC的本质:控制权反转

在传统开发中,创建对象的责任由开发者承担。但在Spring框架中,这一责任被转移给了IoC容器。这种控制权转移就是"反转"的核心含义:

传统开发
开发者创建对象
Spring开发
IoC容器创建对象

具体来说:

  • 传统方式:开发者通过new关键字直接创建对象
  • Spring方式:IoC容器负责创建对象,开发者只需从容器中获取

传统对象创建方式

实体类定义

// src/main/java/com/test/entity/Student.java
package com.test.entity;public class Student {private Integer id;private String name;private Integer age;// 省略Getter/Setter/toString
}

手动创建对象

// src/main/java/com/Test.java
package com;import com.test.entity.Student;public class Test {public static void main(String[] args) {// 开发者手动创建对象Student student = new Student();student.setId(1);student.setName("张三");student.setAge(18);System.out.println(student);}
}

Spring IoC创建对象

1. 添加依赖(pom.xml)

<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.21</version></dependency>
</dependencies>

在这里插入图片描述
确保正确引入依赖

2. 配置文件(spring.xml)

<!-- src/main/resources/spring.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 配置Student对象 --><bean id="student" class="com.test.entity.Student"><property name="id" value="1"/><property name="name" value="张三"/><property name="age" value="22"/></bean>
</beans>

3. 从IoC容器获取对象

// src/main/java/com/Test.java
package com;import com.test.entity.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {// 加载Spring配置ApplicationContext ioc = new ClassPathXmlApplicationContext("spring.xml");// 从容器获取对象Student student = (Student) ioc.getBean("student");System.out.println(student);}
}

IoC底层原理:反射机制

Spring IoC容器通过反射技术动态创建对象:

public static void createObjectByReflection() {try {// 1. 加载类信息Class<?> clazz = Class.forName("com.test.entity.Student");// 2. 获取构造器Constructor<?> constructor = clazz.getConstructor();// 3. 创建对象实例Object instance = constructor.newInstance();// 4. 设置属性值(简化示例)Method setId = clazz.getMethod("setId", Integer.class);setId.invoke(instance, 1);System.out.println(instance);} catch (Exception e) {e.printStackTrace();}
}

为什么默认使用无参构造器?

当IoC容器需要创建多种类型的对象时:

  1. 无法提前知道类的具体结构
  2. 无参构造器是Java类的默认构造器
  3. 无需指定参数,创建过程统一且简单

高级IoC特性

多种获取Bean的方式

1. 通过ID获取

Student student = (Student) ioc.getBean("student");

2. 通过类型获取

Student student = ioc.getBean(Student.class);

注意:当容器中存在多个同类型Bean时,通过类型获取会抛出NoUniqueBeanDefinitionException

有参构造器创建对象

实体类配置构造器

public class Student {public Student(Integer id, String name, Integer age) {// 构造逻辑}// 必须显式声明无参构造器public Student() {}
}

XML配置

<bean id="student3" class="com.test.entity.Student"><constructor-arg name="id" value="3"/><constructor-arg name="name" value="王五"/><constructor-arg name="age" value="18"/>
</bean>

对象级联赋值

关联实体类

// Class.java
public class Class {private Integer id;private String name;// getters/setters
}// Student.java
public class Student {private Class clazz; // 关联属性// 其他属性及方法
}

XML级联配置

<bean id="javaClass" class="com.test.entity.Class"><property name="id" value="101"/><property name="name" value="Java高级班"/>
</bean><bean id="student" class="com.test.entity.Student"><property name="id" value="1"/><property name="clazz" ref="javaClass"/> <!-- 关联引用 -->
</bean>

IoC容器的核心优势

特性传统方式Spring IoC
对象创建开发者控制容器控制
耦合度高耦合低耦合
可维护性修改困难配置修改即可
对象管理分散管理集中管理
测试难度需要真实对象轻松模拟依赖

总结

  1. 控制反转(IoC) 本质是对象创建权的转移
  2. Spring通过反射机制实现对象的动态创建
  3. XML配置是定义Bean的经典方式
  4. IoC容器支持多种对象获取方式复杂对象关系管理
  5. 级联赋值简化了对象间的依赖管理

“不要调用我们,我们会调用你” - IoC的核心理念,将程序控制权交给框架

掌握IoC机制是深入理解Spring框架的基础,它通过解耦组件依赖关系,大幅提高了代码的灵活性和可维护性。

http://www.dtcms.com/a/303201.html

相关文章:

  • Kotlin的datetime库
  • 荣耀应用市场《2025上半年应用合规治理报告》丨开发加油站
  • C# 静态类_静态方法_静态字段(static 声明静态的关键字 )
  • R语言与作物模型(DSSAT模型)技术应用
  • 未授权访问漏洞 总结
  • mysql 关于树形数据结构的一些操作
  • STM32中集成USB驱动
  • SQL 查询语法笔记
  • C语言笔记03 :关于指针的补充
  • 力扣面试150题--颠倒二进制位
  • 第18章 泛型 笔记
  • 第一第二章笔记整理
  • AutoGen - model_clients和model_context使用示例
  • Docker学习相关视频笔记(一)
  • 机器学习sklearn:决策树的参数、属性、接口
  • redis getshell得方式
  • Redis 部署模式详解
  • stm32开发 -- TFTLCD相关
  • Zabbix 6.0 监控AWS全栈实战|EC2至Lambda的无缝监控
  • 配置 MCP 让 cursor 结合 Figma 自动生成设计稿组件
  • Python defaultdict 的强大之处:告别繁琐的字典键检查: Effective Python 第17条
  • Python动态规划:从基础到高阶优化的全面指南
  • 网络与信息安全有哪些岗位:(3)安全运维工程师
  • 微算法科技(NASDAQ:MLGO)利用基于区块链的机器学习模型进行交易分类,实现交易数据的匿名化
  • Linux内核驱动开发核心问题全解
  • shell每日三题大神之路:第三天
  • Java 笔记 transient 用法
  • 四、计算机组成原理——第4章:指令系统
  • EAP(基于事件的异步编程模式)
  • 计算机网络编程-Socket通信以及实战