一 . 前言
这一篇来看看 SpringIOC 里面的一个细节点 , 来简单看看 BeanDefinition 这个对象 , 以及有没有办法对其进行定制.
二. BeanDefinition 的体系
2.1 体系概览
这里面需要关注的几个类分别为 :
- BeanDefinition 接口 : 顶层接口 , 抽象了Bean加载的方法
- AbstractBeanDefinition : 提供了多数方法的默认实现
- RootBeanDefinition : Spring BeanFactory 运行时统一的 BeanDefinition 视图
- GenericBeanDefinition : 编程方式注册 BeanDefinition 的首选类
- ChildBeanDefinition : 可继承BeanDefinition
下面来解释一下这里面说的一些概念 :
什么叫统一视图 ?
稍微从跟踪一下源码就能发现 , 从 xml 或者 JavaConfig 以及 Spring 默认加载的Bean配置类 ,最终都会被修饰为 RootBeanDefinition
GenericBeanDefinition 怎么用 ?
GenericBeanDefinition 是通过编程方式注入的 BeanDefinition 所对应的类 ,通常都是该类的子类 , 包括非Spring 的 ConfigBean 和 ServiceBean
ChildBeanDefinition 又做了什么 ?
一种可以继承 parent 配置的 BeanDefinition , 在加载环节中会通过 AbstractBeanFactory#getMergedLocalBeanDefinition() 来将 child 和 parent bean definition 进行合并。
- BeanDefinition 进行 merge 操作时,会将 child 的属性与 parent 的属性进行合并,当有相同属性时,以 child 的为准
- 如果是 Map 形式的配置 , 会取并集
2.2 BeanDefinition 的作用
- 存储