手写Spring框架-第一弹

介绍和大纲:

spring-1-02 spring-1-05

2:一个简单的Bean容器

目标

  • 用于承载对象,管理对象配置和生命周期,配置Bean如何创建(是否单例),如何相互关联。

  • 存放后,Spring 统一装配,包括Bean的初始化,属性填充。

设计用什么数据结构:

  • 存放在名称索引式的数据结构:HashMap。

  • 流程

    • spring-2-01

工程实现

spring-2-02
  • BeanDefinition,用于定义 Bean 实例化信息,现在的实现是以一个 Object 存放对象。

    • 单独一个Bean 定义: BeanDefinition,可能这是你在查阅 Spring 源码时经常看到的一个类,例如它会包括 singleton、prototype、BeanClassName(类中包含哪些东西)。 但目前目前只定义一个 Object 类型用于存放对象。
  • BeanFactory,代表了 Bean 对象的工厂,可以存放 Bean 定义到 Map 中以及获取。

    • 注册: 这个过程就相当于我们把数据存放到 HashMap 中,只不过现在 HashMap 存放的是定义了的 Bean 的对象信息。 获取: 最后就是获取对象,Bean 的名字就是key,Spring 容器初始化好 Bean 以后,就可以直接获取了。
    • 获取是factory->BeanDefinition->getBean本身。

  • 关注下测试里,beanFactory怎么用的。

    • 初始化 Bean 工厂、注册 Bean、获取 Bean

3、用设计模式,实现 Bean 的定义注册获取

  • 理解设计模式:

    • 编码方式主要依托于:接口定义 || 类实现接口、抽象类实现接口 || 继承类、继承抽象类,而这些操作方式可以很好的隔离开每个类的基础功能、通用功能和业务功能,当类的职责清晰后,你的整个设计也会变得容易扩展和迭代。

    • 接口和抽象类的区别,接口是实现,抽象类是为了继承。

      • 也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。

设计:

spring-3-01
  • 注册只注册类信息(Object变Class)-》 getBean时处理实例化+判断单例对象是否在容器中缓存。

实现:

spring-3-02
BeanFactory这样一个Bean工厂(接口),提供getBean SingletonBeanRegistry 接口,DefaultSingletonBeanRegistry对接口实现,会被抽象类 AbstractBeanFactory 继承,具备了单例 Bean 的注册功能。。现在 AbstractBeanFactory 就是一个非常完整且强大的抽象类了,也能非常好的体现出它对模板模式的抽象定义。 接口由抽象类 AbstractBeanFactory实现getBean方法。这样使用模板模式(opens new window)的设计方式,可以统一收口通用核心方法的调用逻辑和标准定义,也就很好的控制了后续的实现者不用关心调用逻辑,按照统一方式执行。那么类的继承者只需要关心具体方法的逻辑实现即可。 AbstractBeanFactory 中又定义了两个抽象方法:getBeanDefinition(String beanName)、createBean(String beanName, BeanDefinition beanDefinition) ,而这两个抽象方法分别由 DefaultListableBeanFactory、AbstractAutowireCapableBeanFactory 实现。 继承抽象类 AbstractBeanFactory 后的 AbstractAutowireCapableBeanFactory 就可以实现相应的抽象方法了,因为 AbstractAutowireCapableBeanFactory 本身也是一个抽象类它只会实现属于自己的抽象方法,其他抽象方法由继承 AbstractAutowireCapableBeanFactory 的类实现。这里就体现了类实现过程中的各司其职,你只需要关心属于你的内容,不是你的内容,不要参与。

map用来存放definition定义额,Singleton存放的是对象本身。

  • Exception处理

    • 定义BeansException类,继承RuntimeException。
    • (msg) (msg, e) 调用上面的构造方法
  • 第一步:Bean的类定义

    • Bean中存放的是对象的类,改用Class
    • 实例化操作转交给容器。
  • BeanFactory 接口:

    • 定义了普通的getBean方法
  • 单例注册 接口 定义和实现

    • SingletonBeanRegistry接口定义行为。

    • DefaultSingletonBeanRegistry 类来 实现接口

      • //需要map, get , add 方法
      • 一个protected 的 addSingleton 方法,这个方法可以被继承此类的其他类调用(本类和子类。 )

  • AbstractBeanFactory -- 抽象类 定义模板方法

    • 目的

      • 实现了BeanFactory接口,实现了getBean方法

      • 继承了单例的注册addSingleton 和 getSingleton方法

        • getBean默认调用singleton,不成功就创建一个。
        • 缓存中没有
      • //定义了两个抽象方法, 且protected getBeanDefinition createBean
  • 实例化Bean类(AbstractAutowireCapableBeanFactory) 抽象类

    • 继承上面的抽象类,并实现了creatBean方法

    • bean = beanDefinition.getBeanClass().newInstance(); addSingleton(beanName, bean);
    • 流程:通过Class的newInstance 调用默认构造方法(无参构造)即可。

      • 然后用addSingleton 增加到单例map中
  • 核心类实现(DefaultListableBeanFactory)

    • 最后Factory实现注册和获取

    • 注册要实现接口,BeanDefinitionRegistry中的方法

      • registerBeanDefinition(name, definition)
    • 这里用hashMap存储:HashMap


__EOF__

本文作者userName
本文链接https://www.cnblogs.com/Blunt-Raz0r/p/17790958.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Blunt-Razor  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示