知识点:
1.快速入门
知识点 | 核心内容 | 重点 |
IOC容器创建 | 通过ClassPathXmlApplicationContext加载XML配置文件创建容器,关联beans.xml | 容器与配置文件的绑定关系(多配置文件支持) |
Bean获取方式 | 1. getBean(String id)返回Object需强转; 2. getBean(String id, Class<T> type)直接返回目标类型 | 方法重载区别(编译类型与运行类型验证) |
运行类型验证 | 通过getClass()输出对象实际类型,确认Spring容器管理的Bean实例 | 强转前提是配置的全路径类名正确 |
属性访问 | 强转后直接调用Bean的getter方法(如getName())获取配置属性 | XML配置属性与类字段的映射关系 |
容器结构 | ApplicationContext接口的多种实现类(如FileSystemXmlApplicationContext) | 不同实现类的适用场景(未展开) |
测试框架集成 | 使用JUnit测试Spring Bean,演示@Test注解和断言逻辑 | 版本兼容性问题(提及JUnit 5.4) |
2.类加载路径
知识点 | 核心内容 | 重点 |
Spring类加载路径机制 | 程序运行时默认从out/production/[项目名]目录读取资源文件(如beans.xml),而非直接读取src下的源文件 | 类路径与实际文件路径的差异(src vs out/production) |
ClassPathXmlApplicationContext工作原理 | 通过new ClassPathXmlApplicationContext("beans.xml")加载配置文件时,自动基于类加载路径定位文件 | 需明确beans.xml必须存在于编译后的资源目录(如resources文件夹或src编译产物) |
类路径验证方法 | 使用this.getClass().getResource("/").getPath()输出实际类加载路径 | 动态验证路径与预期是否一致(如IDE构建工具差异) |
资源文件部署逻辑 | src下的配置文件在编译后会自动复制到out/production对应目录 | 子目录结构需保持一致性(如src/com/config → out/production/com/config) |
3.Debug配置
知识点 | 核心内容 | 重点 |
Spring容器结构分析 | 通过debug方式观察Spring容器内部结构,理解其机制 | 容器数据视图差异(配置导致显示不同) |
OOP编程思想 | 强调通过debug输出对象结构是高效学习方式 | 对象结构可视化的重要性 |
IDEA调试配置 | Settings > Debugger > Data Views控制debug数据展示逻辑 | 空元素显示开关(Hide null elements)和视图简化开关(Enable alternative view) |
Step Into源码调试 | 需取消勾选Do not step into the classes以进入指定类源码 | 默认配置可能阻止进入JDK/库类源码 |
Debug视图差异根源 | 数据展示差异由Data Views配置项决定,非版本问题 | 配置一致性对协作调试的影响 |
ConcurrentHashMap结构 | 通过beanDefinitionMap的table数组观察实际存储结构 | 空元素隐藏可能导致误解底层结构 |
4.Spring容器结构剖析
知识点 | 核心内容 | 重点 |
Spring IOC容器结构 | IOC容器是重量级对象,通常单例存在,内部通过ConcurrentHashMap存储Bean定义信息 | BeanDefinitionMap与SingletonObjects的区别(定义信息 vs 实例化对象) |
BeanDefinition存储机制 | 配置的Bean信息(如monster类路径、属性值)存储在BeanDefinitionMap的ConcurrentHashMap中(初始大小512) | 懒加载(lazy-init)与立即加载的触发时机 |
Bean实例化过程 | 单例对象实际存储在SingletonObjects的ConcurrentHashMap中,Key为Bean ID,Value为实例化对象 | 反射创建对象依赖BeanDefinition中的类路径和属性值 |
ConcurrentHashMap底层结构 | 使用Node内部类(哈希值+Key+Value+链表结构)存储数据,支持高并发 | 哈希算法定位与泛型设计(适应不同Bean类型) |
属性值注入逻辑 | propertyValues字段记录XML配置的属性(如monsterId=100),通过反射注入到实例化对象 | 动态创建非单例Bean时如何复用属性配置 |
5.Spring容器结构剖析
知识点 | 核心内容 | 重点 |
IOC容器结构 | 容器类型为ClassPathXmlApplicationContext,包含BeanFactory等属性 | BeanFactory与ApplicationContext的区别 |
BeanDefinitionMap | 使用ConcurrentHashMap存储XML配置的Bean节点信息 | 并发容器选择原因(线程安全 vs 性能) |
Bean存储机制 | 通过哈希算法将Bean信息存入数组(初始容量512),动态扩容 | 哈希冲突处理与扩容触发条件 |
Bean节点解析 | 保存Bean的ID、类信息、属性值、懒加载配置等 | 懒加载与立即加载的底层实现差异 |
属性映射 | PropertyValues数组存储XML中配置的属性名和值 | 反射注入属性时的类型转换问题 |
底层模拟实现 | 手写Spring需模拟BeanDefinitionMap和ConcurrentHashMap结构 | Node节点中KV的设计(Key=Bean ID, Value=元数据) |
6.Spring容器结构剖析
知识点 | 核心内容 | 重点 |
Spring容器结构 | bin factory中的single objects属性存储单例对象 | 区分bind ebinishm AP(定义map)和single objects(实例对象) |
单例模式实现 | 通过concurrent hash map实现线程安全的单例存储 | 单例对象直接初始化放入table,非单例则动态创建 |
对象获取流程 | get bin时先查bin definition,再根据单例标识决定从缓存获取或反射创建 | 理解ID->定义->实例的三层跳转逻辑 |
辅助设计机制 | bin definition names用array list存储所有配置的ID名称 | 快速定位功能与容器性能的平衡设计 |
IOC容器本质 | beans点插门文件配置信息与运行时容器对象的映射关系 | 配置元数据(bin definition)与实际实例(single objects)的分离 |
7.Spring容器结构练习
知识点 | 核心内容 | 重点 |
IOC容器结构 | 讲解IOC容器的核心结构及其重要性,理解结构后能更清晰掌握Spring相关方法 | 容器结构的逻辑关系、bin definition names属性的作用 |
获取容器中的Bean信息 | 通过getBinDefinitionNames()方法获取所有Bean的ID,并遍历输出 | getBinDefinitionNames()返回的是数组结构,需注意遍历方式 |
Bean的配置与ID唯一性 | 配置多个Bean时,ID必须唯一,否则会导致冲突;类型可以相同,但值不同 | ID冲突问题、Bean的作用域(单例/原型) |
Debug视图优化 | 调整Debug视图过滤空元素,简化数据结构展示,便于观察Bean的存储位置 | 视图配置方法、singleObjects和binDefinitionMap的实际存储结构 |
Spring容器启动时的默认Bean | 容器启动时会预先加载系统默认的单例Bean(如applicationStartup、lifecycleProcessor等) | 系统Bean的作用、自定义Bean与系统Bean的区分 |
8.实现简单基于XML配置程序 需求说明
知识点 | 核心内容 | 重点 |
Spring容器基础实现 | 手动开发基于XML配置的简易Spring容器,读取beans.xml文件并实例化首个JavaBean(如master对象) | 属性注入与容器存储逻辑(需区分原生框架与模拟实现的差异) |
XML配置解析 | 通过property标签获取Bean属性值(如name="牛魔王"、id=100),完成对象赋值 | 文件解析顺序(仅处理首个Bean,非全量遍历) |
容器机制模拟 | 实现getBean()方法输出对象信息,简化版IoC流程(创建→赋值→存储→输出) | 与Spring原生容器的核心差异(如生命周期管理、依赖注入等) |
实践目标 | 理解Spring底层机制(强调流程梳理,非完整功能复现) | 需明确"超级简单"实现与工业级容器的边界 |
9.实现简单基于XML配置程序 思路分析
知识点 | 核心内容 | 重点 |
Spring容器实现机制 | 通过XML解析、反射和ConcurrentHashMap实现简易IoC容器 | 单例对象存储方式 vs 原型模式 |
DOM4J技术应用 | 解析beans.xml配置文件获取bean定义信息 | class路径解析与异常处理 |
反射机制 | 通过无参构造器创建对象并动态设置属性值 | 属性注入与类型转换问题 |
容器设计模式 | 使用ConcurrentHashMap存储单例bean对象 | 并发控制与线程安全问题 |
简易IoC流程 | 1. XML解析 → 2. 反射实例化 → 3. 属性注入 → 4. 容器注册 → 5. getBean方法 | 流程顺序与各环节异常处理 |
工程简化原则 | 聚焦核心机制(单例处理)而非完整功能 | 遍历逻辑与扩展性设计取舍 |