【Spring源码】3.IOC之BeanDefination与BeanFactory介绍

  • BeanDefinition
    • 为什么这样设计?
      • 假设没有BeanDefinition
      • 有BeanDefinition
    • BeanDefinition 属性介绍
  • BeanFactory
    • 引用关系
    • 类继承关系

BeanDefinition

spring的所有bean的实例化都必须先创建BeanDefinition对象,该对象包含了bean实例化时的行为属性,后续实例化的过程会解析这个BeanDefinition对象,根据对象的属性决定如何实例化bean。

为什么这样设计?

假设没有BeanDefinition

假设没有 没有BeanDefinition 这一层的存在,Spring 实例化Bean的模型是这样的,

image

这个时候,由于版本更迭,xml配置的形式 被弃用,需要使用 注解的方式注解Bean,由于解析工作与实例化的代码 冗杂在一起, xml那一套完全 不被使用, 需要重新写一套 边解析注解,边实例化的 逻辑。由于设计的缺陷,导致了开发的工作量提升, 且代码复用性 也不高。

image

有BeanDefinition

现在 存在BeanDefinition,Spring 解析xml文件,实例化Bean的模型是这样的,

image

此时需要增加 扫描注解 实例化Bean的逻辑,那么就只有 解析的工作不一样,后面的实例化部分的逻辑可以共用。 而解析 其实只是 ioc 很小的一部分而已。实现了 解析配置和 实例化的耦合,增加了代码的复用性,可维护性, 可拓展性。

image

如果 再需要加一种 注册Bean的方式, 比如文件,网络,那么只要 拓展 对应的解析阶段的逻辑 , 保持 实例化Bean的逻辑不变。

image

BeanDefinition 属性介绍

image

BeanFactory

他是上下文类中一个成员变量,
他里面封装了很多bean以及beanDefinition的操作,典型的工厂模式设计模式。

引用关系

被ApplicationContext持有,是它的成员变量

image

类继承关系

image

重要属性

  1. BeanDefinitionMap :存储BeanName 和 BeanDefinition的 映射关系。
  2. BeanDefinitionNames : 存储所有的Bean的名称的有序集合。
  3. parentBeanFactory : 父工厂的引用,springmvc 的bean工厂的该属性 为 ioc 容器的bean工厂。
  4. List beanPostProcessors : 存储所有的BeanPostProcessor实例。
  5. Map singletonObjects : 存储 所有的单例Bean。

提供的方法

image

你可能感兴趣的:(【Spring源码】3.IOC之BeanDefination与BeanFactory介绍)