news 2026/5/16 3:19:04

(29)阶段性个人总结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(29)阶段性个人总结

至此我们已经学完spring中最大两个的特性之一IoC

为什么要有Ioc?

在传统的项目中我们发现我们的程序通过new的方式来创建对象的时候,耦合度较高,下层改变了什么(比如说换了个数据库),上层的代码就要跟着改变,实际上这是我们不希望看到的。它违反了依赖倒置,也使得系统难以扩展,这也不符合OCP开闭原则,(对扩展开放, 对修改关闭),所以这时候spring出来了,它帮我们进行对象的实例化,同时维护类的关系。

springIoc的原理

Spring IoC 容器通过多种机制创建 Bean 实例(包括但不限于构造方法),并通过 setter 方法或构造方法参数完成依赖注入。对于普通 POJO,默认使用反射调用构造方法创建对象;但对于工厂、代理等高级场景,则委托用户代码控制实例化过程。

  • Spring 在启动时会解析配置文件,注册所有 BeanDefinition(包含类创建时所需要的信息);对于singleton 作用域的 Bean(非懒加载),会在容器刷新阶段完成实例化和初始化。

    • 解析配置文件
      Spring 通过 XML 解析器(如 DOM4J 或 JDK 内置解析器)读取配置文件,提取 <bean> 标签中的 id、class、属性值等信息,构建 BeanDefinition。,取出spring要的信息(bean的id,全路径参数,为简单类型赋值的属性值等等)。
    • bean创建
      因为spring的配置文件中我们把类的全路径都给了spring,所以它可以通过反射创建出这个类。Spring 在创建每个 Bean 时,会递归解析其依赖:若依赖的 Bean 尚未创建,则立即转去创建它。
    • 对象的存储
      在一个map(String,Object)集合中以key存id,value存这个具体的类的方式存储这个bean。单例 Bean 最终存储在singletonObjects(一级缓存)中,但在创建过程中还会用到二级、三级缓存以支持循环依赖。
    • bean的赋值
      属性赋值发生在该 Bean 实例化之后、初始化之前。遍历所有集合将对象取出来,分两种类型,判断一下。为复杂属性赋值:我们直接通过id把这个类取出来赋值即可;为简单属性赋值:我们需要判断这串字符串的类型(有工具包,或者一个一个的判断),然后转成对应的类型为字段赋值。补充:Spring 使用 TypeConverter + PropertyEditor 机制进行类型转换,例如:
  • 注意:按需创建 + 提前暴露早期引用(三级缓存)来解决循环依赖。

  • 解决循环依赖具体步骤:

    1. 创建 A(调用构造器 → 得到原始对象)
    2. 将 A 的ObjectFactory放入三级缓存
    3. 开始给 A 赋值,发现依赖 B
    4. 转去创建 B
    5. 原始对象创建后,立刻暴露 ObjectFactory 到三级缓存
    6. 给 B 赋值,发现依赖 A
    7. 当 B 需要注入 A 时,Spring 从三级缓存中通过 ObjectFactory 获取 A 的早期引用(尚未完成属性注入和初始化),并将其注入给 B。”
    8. B 初始化完成 → 放入一级缓存
    9. 回到 A,注入已创建的 B
    10. A 初始化完成
  • bean的实例化的方式其实有多种
    Spring 提供了多种 Bean 实例化方式以适应不同场景。虽然它们在容器中表现为统一的 Bean 实例,但底层创建机制并不相同:有些通过构造方法,有些通过工厂方法,有些甚至返回代理或复用对象,并非都依赖目标类的构造方法。

  • bean的作用域

    • bean标签的scope属性指明了bena的作用域的范围,默认为单例形式,即一个程序中一个id只有一个的bean,而对于 prototype 作用域的 Bean则对数量没有限制,它完全交给了客户端代码处理
    • 注意:循环依赖仅在singleton 作用域 + setter/field 注入下被 Spring 支持;prototype、request 等作用域不支持循环依赖。
  • 实例化只是bean的生命周期的前面两步

    • 第一步:创建Bean
    • 第二步:Bean属性赋值
    • 第三步:初始化Bean
    • 第四步:使用Bean
    • 第五步:销毁Bean

注解加入后流程的变化:

注解的存在主要是为了简化XML的配置。Spring6后倡导全注解开发
前情提要:
@Controller、@Service、@Repository这三个注解都是@Component注解的别名
在类上加上注解后,我们便不需要在xml文件中书写bean标签了,我们只需要在xml文件中指定扫描的包就行了,实际上连这一步也可以在属性类上配置,所以可以说有了注解,我们便离开了传统的麻烦的在xml文件中书写bean标签的方式。

那么spring到底是如何实现的这一方法的呢?

其背后的核心机制是组件扫描(Component Scanning) + 注解元数据解析 + BeanDefinition 注册
java配置类中:

@Configuration@ComponentScan("com.powernode.spring6")publicclassAppConfig{}

  1. Spring 使用ResourcePatternResolver扫描classpath下的 .class 文件
    通过 ASM(字节码分析库)读取类的注解信息(避免加载类到 JVM,提升性能)
    只有在真正需要实例化时,才通过Class.forName()加载类并反射创建
    这解释了为什么 Spring 启动快 —— 扫描时不加载类,只读字节码元数据。
  2. 查看类上是否有注解@Component及其其派生注解
  3. 有的话创建一个BeanDefinition类,里面记录了创建类所用到的信息
  4. BeanDefinition注册到BeanFactory
  5. 后续流程与 XML 方式完全一致
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/11 4:13:49

【稀缺资料】Open-AutoGLM定时任务配置秘籍:仅限内部流传的4种高级模式

第一章&#xff1a;Open-AutoGLM定时任务配置概述Open-AutoGLM 是一个面向自动化大语言模型任务调度的开源框架&#xff0c;支持通过声明式配置实现模型推理、数据预处理与结果后处理等任务的周期性执行。其核心功能之一是基于标准时间表达式的定时任务管理&#xff0c;允许用户…

作者头像 李华
网站建设 2026/5/9 3:21:28

拍照即知热量?Open-AutoGLM让你5分钟掌握智能饮食控制术

第一章&#xff1a;拍照即知热量&#xff1f;Open-AutoGLM开启智能饮食新时代在健康管理日益受到重视的今天&#xff0c;饮食控制成为关键一环。Open-AutoGLM 的出现&#xff0c;正在重新定义我们与食物的交互方式——只需对餐盘拍照&#xff0c;系统即可自动识别食材种类、估算…

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

Linly-Talker支持动态背景替换,视频创意无限延伸

Linly-Talker支持动态背景替换&#xff0c;视频创意无限延伸 在短视频与直播内容爆炸式增长的今天&#xff0c;一个核心问题始终困扰着创作者&#xff1a;如何以更低的成本、更快的速度&#xff0c;持续产出高质量、高吸引力的视觉内容&#xff1f;尤其对于企业宣传、在线教育、…

作者头像 李华
网站建设 2026/5/11 11:17:04

jQuery UI 实例 - 滑块(Slider)

jQuery UI Slider&#xff08;滑块&#xff09;实例 Slider 是 jQuery UI 中用于选择数值或范围的交互组件&#xff0c;常用于音量调节、价格筛选、时间选择、颜色调整等场景。支持单手柄、范围选择&#xff08;双柄&#xff09;、垂直方向、步长、动画等。 官方演示地址&…

作者头像 李华
网站建设 2026/5/10 14:07:28

Open-AutoGLM饮食热量统计实战指南(从0到1搭建个人营养AI助手)

第一章&#xff1a;Open-AutoGLM饮食热量统计Open-AutoGLM 是一个基于大语言模型的自动化数据处理框架&#xff0c;专为日常健康管理场景设计。其核心功能之一是通过自然语言输入自动解析食物摄入记录&#xff0c;并精确计算总热量。该系统结合了营养数据库与语义理解能力&…

作者头像 李华
网站建设 2026/5/1 7:53:26

jQuery UI 实例 - 自动完成(Autocomplete)

jQuery UI Autocomplete&#xff08;自动完成&#xff09;实例 Autocomplete 是 jQuery UI 中非常实用的组件&#xff0c;用于输入框提供智能建议列表&#xff0c;支持本地数据、远程 AJAX 数据、分类显示、自定义渲染等。常用于搜索框、标签输入、地址补全等场景。 官方演示…

作者头像 李华