我们从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博客 这篇文章写的比较详细
剩下的几个类则较为复杂,以后再看吧。