手把手带你写一个 MiniSpring
郭屹
前 Sun Microsystems Java 研发工程师,开源软件 MiniSpring、MiniTomcat 开发者
6170 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 26 讲
手把手带你写一个 MiniSpring
15
15
1.0x
00:00/00:00
登录|注册

06|再回首:如何实现一个IoC容器?

你好,我是郭屹。
第一阶段的学习完成啦,你是不是自己也实现出了一个简单可用的 IoC 容器呢?如果已经完成了,欢迎你把你的实现代码放到评论区,我们一起交流讨论。
我们这一章学的 IoC(Inversion of Control)是我们整个 MiniSpring 框架的基石,也是框架中最核心的一个特性,为了让你更好地掌握这节课的内容,我们对这一整章的内容做一个重点回顾。

IoC 重点回顾

IoC 是面向对象编程里的一个重要原则,目的是从程序里移出原有的控制权,把控制权交给了容器。IoC 容器是一个中心化的地方,负责管理对象,也就是 Bean 的创建、销毁、依赖注入等操作,让程序变得更加灵活、可扩展、易于维护。
在使用 IoC 容器时,我们需要先配置容器,包括注册需要管理的对象、配置对象之间的依赖关系以及对象的生命周期等。然后,IoC 容器会根据这些配置来动态地创建对象,并把它们注入到需要它们的位置上。当我们使用 IoC 容器时,需要将对象的配置信息告诉 IoC 容器,这个过程叫做依赖注入(DI),而 IoC 容器就是实现依赖注入的工具。因此,理解 IoC 容器就是理解它是如何管理对象,如何实现 DI 的过程。
举个例子来说,我们有一个程序需要使用 A 对象,这个 A 对象依赖于一个 B 对象。我们可以把 A 对象和 B 对象的创建、配置工作都交给 IoC 容器来处理。这样,当程序需要使用 A 对象的时候,IoC 容器会自动创建 A 对象,并将依赖的 B 对象注入到 A 对象中,最后返回给程序使用。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了如何实现一个IoC容器,从原始IoC实现开始,逐步扩展Bean,解决循环依赖问题,并支持注解。文章强调了在单例模式下,容器管理所有的Bean时,多线程环境下可能存在线程安全问题,并提出了避免共享数据、使用线程安全的数据结构、同步和使用ThreadLocal等方法来保证数据的线程安全性。读者可以通过本文了解IoC容器的实现原理,包括对象实例化、依赖注入、构造器注入和注解支持等技术特点。文章内容丰富,适合技术人员深入学习和交流讨论。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一个 MiniSpring》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • 郭硕
    老师多讲一些在SUN公司能了解到的关于Spring的内幕吗,比如出了什么特性,当时SUN内部的反应。目前老师讲的这些在网上基本都能搜到,没有比一般的博主深入太多。感觉不能体现出来老师的在SUN任职过的特殊经历,更想听听当时的历史背景和演化的过程。

    作者回复: 真没什么内幕。

    2023-03-24归属地:浙江
    7
  • Jay
    有两个问题需要请教一下老师: 1. 构造器注入和setter注入对比中构造器优点第三条:“适用于生命周期较短的对象,对象在实例化时会获得所需要的的依赖,对象销毁时也会自动释放”。 目前我们所实现的IoC容器还没有对象销毁功能,所有的示例都还保存在容器中,那也就不会被JVM回收吧?后续是否需要实现bean的销毁功能呢? 2. 没想明白怎么实现“构造器注解autowired注入”:autowired processor是在bean实例化之后,也就是构造函数完成之后,那这个时候还如何通过autowired注入呢?这个时候构造函数要么调用完成了,要么调用失败了呀?

    作者回复: 1,没有实现销毁功能。 2,实例化时通过反射调用构造函数进行的,在准备构造函数参数的时候遇到bean就再次调用getBean()就可以了。

    2023-03-24归属地:湖北
    3
  • peter
    请问:ThreadLocal方法有数据一致性问题吗?假设两个线程共享数据A,线程1在自己的ThreadLocal中有副本A1,线程2在自己的ThreadLocal中有副本A2,那么,A1、A2和A之间会存在数据一致性问题吗? A1、A2需要更新到A吗?

    作者回复: ThreadLocal设计思路不是为了共享和同步而是为了隔离,多个线程隔离开的。你的例子中A1和A2是没有关系的,不存在共享A的问题。

    2023-03-25归属地:山西
    1
  • Geek_a551cb
    ListableBeanFactory和ConfigurableBeanFactory都继承自BeanFactory;ConfigurableListableBeanFactory又继承ListableBeanFactory和ConfigurableBeanFactory;可不可以改成ConfigurableListableBeanFactory继承Listable、Configurable和BeanFactory;重复继承总感觉不好

    作者回复: follow Spring本身

    2024-02-14归属地:四川
  • Geek_08c860
    代码仓库:https://gitee.com/funktest7ff/mini-spring 划分了多个模块,每个模块是一个版本的实现
    2023-12-20归属地:北京
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部