Spring中的BeanFactory及其实现

123 阅读3分钟

屏幕截图 2023-09-26 171325.png 我们从spring容器的三大顶级接口开始看起:

  • BeanFactory 最为重要的接口,里面定义了getBean,getType,isSingleton,等方法,beanFactory会在bean的生命周期的各个阶段中对bean进行各种管理,并且spring将这些阶段通过各种接口暴露给我们,让我们可以对bean进行各种处理,我们只要让bean实现对应的接口,那么spring就会在bean的生命周期调用我们实现的接口来处理该bean。
  • SingletonBeanRegister 提供了管理单例bean的接口
  • AliasRegister 提供了bean别名的注册方法

接下来我们大概看一下几个次级接口

  • ListableBeanFactory内有一系列查找方法可以根据bean的名字,类型进行查找
  • HierarchalBeanFactory 进行父子查找的相关容器
  • BeanDefinitionRegister 它定义了关于 BeanDefinition 的注册、移除、查询等一系列的操作,该接口有三个实现类:DefaultListableBeanFactory、GenericApplicationContext、SimpleBeanDefinitionRegistry,其中 GenericApplicationContext 底层调用的是 DefaultListableBeanFactory 中的实现方法,所以严格意义上来说,只有两个实现类。

一个比较重要的接口ConfigurableBeanFactory

ConfigurableBeanFactory 这个巨大的工厂接口,继承自HierarchicalBeanFactory 和 SingletonBeanRegistry 这两个接口,并额外独有37个方法,这37个方法包含了工厂创建、注册一个Bean的众多细节。这个工厂名为ConfigurableBeanFactory,真是名不虚传!其中有

  • 对父接口中HierarchicalBeanFactory得获取父beanfactory的方法进行set

  • 对类的加载器ClassLoader进行set和get

  • 属性的编辑器PropertyEditorRegistrar,类的转换器TypeConverter进行注册

  • 添加处理bean的后处理器的方法addBeanPostProcessor

  • 2个跟Bean别名相关的方法、1个返回合并后的Bean定义的方法。

  • 对指定的Bean注册依赖并进行返回registerDependentBean

  • 3个销毁bean的方法

  • 1个安全访问上下文的方法AccessControlContext

AutowireCapableBeanFactory

提供了自动装配Bean的实现,提供bean创建(带有构造函数解析)、属性填充、连接(包括自动装配)和初始化。处理运行时bean引用、解析托管集合、调用初始化方法等。支持自动装配构造函数、按名称的属性和按类型的属性。
bean创建过程中,主要的方法比如createBean(), initializeBean(), applyBeanPostProcessorsBeforeInitialization(), applyBeanPostProcessorsAfterInitialization()。
需要注意的是AutowireCapableBeanFactory并不打算给普通的应用程序直接使用,典型的使用场景还是建议使用BeanFactory或者ListableBeanFactory。

ConfigurableListableBeanFactory

ConfigurableListableBeanFactory提供bean definition的解析,注册功能,以及singleton的预实例化(解决循环依赖问题)

DefaultSingletonBeanRegister

DefaultSingletonBeanRegistry是SingletionBean注册器的默认实现。 作用:

  • 存储单例Bean
  • 存储Bean之间的依赖关系
  • 存储Bean的包含关系(外部类包含内部类)
  • Bean所处的状态(正在创建、创建完毕等)
  • 负责单例Bean的销毁(在其中会看到销毁方法的回调)

这里总结一下三个缓存的作用:

  • singletonObjects:存储完全实例化的Bean
  • earlySingletonObjects:存储具有循环依赖的Bean
  • singletonFactories:存储未完全实例化完毕的Bean(某些依赖未注入)

关于其中重要方法的解读spring源码阅读(5.1.0)——DefaultSingletonBeanRegistry_defaultsinglebean-CSDN博客 这篇文章写的比较详细

剩下的几个类则较为复杂,以后再看吧。